你需要懂的Kotlin开发技巧之十

1,373 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

string.xml资源id快速转换String

定义如下扩展属性:

val Int.resToString: String
    get() = MainApp.mApplication.getString()

使用起来就很方便了:R.string.xxx.resToString

View隐现设置

平常设置View显隐的方式this.visibility = View.xxx有点麻烦,封装下:

fun View.hide() {
    this.visibility = View.GONE
}

fun View.show() {
    this.visibility = View.VISIBLE
}

使用起来:view.hide()view.show()。我们项目中还有根据判断条件设置View显隐的逻辑,针对这个再封装下:

fun View.showIf(isShow: Boolean) {
    if (isShow) {
        show()
    } else {
        hide()
    }
}

设置View背景颜色

先直接封装下面两个扩展属性:

  1. 将String类型的颜色值转换成Int值
val String.color: Int
    get() = Color.parseColor(this)
  1. 快捷设置View背景
inline var View.bgColor: String
    get() = ""
    set(value) {
        setBackgroundColor(value.color)
    }

最后就可以这样使用了:

mBinding.root.bgColor = "#00ff00"

::成员引用

之前写的一篇文章你需要懂的Kotlin开发技巧之三有提到怎么判断一个lateinit var的属性有没有初始化使用的是:this::age.isInitialized,这个::是什么呢?这个其实和java中的成员引用差不多。

data class Student(@JvmField val name1: String = "") {
    fun getName() = name1
}
  • 引用属性 比如Student::name1这种就是引用属性,我们看下Student::name1是个什么东东:

image.png

是一个KProperty1类型的属性,泛型中的第一个类型代表当前属性所在的类,第二个类型代表属性值的类型,有点类似于属性反射,需要传入Student才能拿到name1的内容:

image.png

我们看下KProperty1这个类:

image.png

KProperty1提供了get方法帮助我们获取到值,再看下它的父类对象:

image.png
继续看下父类的父类:KCallable

image.png

这里面的属性是不是很熟悉,都是大家常用到的判断一个属性是否为抽象、是否可被子类重写、是否是延迟初始化属性等等

如果是在类内部引用类的属性,比如this::xxx,返回的类型将是一个Kproperty0类型:

image.png

我们熟悉的isInitialized判断属性是否初始化的就是Kproperty0的一个扩展方法:

image.png

  • 引用方法 方法引用这个使用起来也很普遍,我在之前文章基于BRVAH和RecycleView封装适配器时就使用到了,直接将其转换成函数类型作为构造参数进行传递。

我们看下Student::getName通过类引用方法的是个什么东西:

image.png

可以看到这就是一个KFunction1对象,如果引用的方法中带有一个参数呢:

image.png

就变成了KFunction2了:

image.png
也就是说,随着方法的参数增加,::方法引用的类型值也在不断变化KFunction数字,但是不管类型怎么变化,都会实现同一个接口KFunction

image.png

是不是很熟悉,我们可以通过这个来判断方法是否为内联方法、中缀方法、运算符重载方法、协程挂起方法等等。而且KFunction也实现了KCallable,我们也可以用来判断方法是否抽象、open的等等

总结

关于kotlin相关的知识系列陆陆续续已经写了十篇文章了,基本上总结了Kotlin使用的过程中一些注意点以及使用技巧,这里就不粘贴其他的文章链接了,大家有兴趣可以关注下下面的专栏:Kotlin演义

后续就计划准备研究下Sequence及其内部机制、Kotlin反射元编程等相关知识了。