前言
Kotlin
是一种在Java
虚拟机上运行的静态类型编程语言,被称之为Android
世界的Swift
,在Google
I/O2017中,Google
宣布Kotlin
成为Android
官方开发语言
![](https://img.haomeiwen.com/i25609565/2d5b169f98105ec8.jpg)
什么是扩展属性
扩展属性与扩展函数类似,但是需要注意的是我们在使用扩展函数的时候会发现,而是生成了对应的调用静态函数,并没有真正的扩展了类中的函数
fun TextView.setTextOptional(text: String?) {
this.text = if (text.isNullOrEmpty()) {
"NaN"
} else {
text
}
}
编译生成
public static final void setTextOptional(@NotNull TextView $this$setTextOptional, @Nullable String text) {
$this$setTextOptional.setText((CharSequence)(var6 ? "NaN" : text));
}
扩展只是语法层面的一个表现,并没有实际的成员插入到类中去,所以对扩展属性来说,幕后字段是无效的,也就是说扩展属性不能有初始化容器,只能通过set/get
去进行使用
val Response.hasCode:Boolean = false //报错,不能有初始化容器
val Response.hasCode:Boolean //正确
get() = code.isEmpty()
在一个类中定义另一个类的扩展
通常我们会在顶级声明处声明扩展,也可以将扩展声明在另一个类中
如果声明在文件顶层则可以访问同一文件中其他private的顶层声明,因为相同文件中的顶层声明编译时会生成在同一个类文件中
fun TextView.setTextOptional(text: String?) {
this.text = if (text.isNullOrEmpty()) {
"NaN"
} else {
text
}
}
val Response.hasCode:Boolean
get() = code.isEmpty()
顶层声明会被编译为以下代码,事实上他们是在同一个类文件中,是可以互相访问的
public final class TestKt {
public static final void setTextOptional(@NotNull TextView $this$setTextOptional, @Nullable String text) {
$this$setTextOptional.setText((CharSequence)(text? "NaN" : text));
}
public static final boolean getHasCode(@NotNull Response $this$hasCode) {
return (CharSequence)$this$hasCode.getCode().length() == 0;
}
}
如果声明在其他类中
class LoginResponseHandler{
val Response.isPass: Boolean
get() = code == "0" && data.equals("success", true)
}
public final class LoginResponseHandler {
public final boolean isPass(@NotNull Response $this$isPass) {
return Intrinsics.areEqual($this$isPass.getCode(), "0") && StringsKt.equals($this$isPass.getData(), "success", true);
}
}
如果扩展函数内部调用与当前类中的函数冲突,则需要显示的指定this
对象
class LoginResponseHandler{
val Response.isPass: Boolean
get() = code == "0" && data.equals("success", true)
fun Response.responseToString(){
toString() //Response.toString()
this@LoginResponseHandler.toString() //LoginResponseHandler.toString()
}
}
欢迎关注Mike的简书
Android知识整理
网友评论