提供委托
通过定义 provideDelegate 操作符,可以扩展创建属性实现所委托对象的逻辑。 如果 by 右侧所使用的对象将 provideDelegate 定义为成员或扩展函数,那么会调用该函数来 创建属性委托实例。
provideDelegate 的一个可能的使用场景是在创建属性时(而不仅在其 getter 或 setter 中)检查属性一致性。
例如,如果要在绑定之前检查属性名称,可以这样写:
class ResourceLoader<T>(id: ResourceID<T>) {
operator fun provideDelegate(
thisRef: MyUI,
prop: KProperty<*>
): ReadOnlyProperty<MyUI, String> {
checkProperty(thisRef, prop.name)
// 创建委托
return object: ReadOnlyProperty<MyUI, String> {
override fun getValue(thisRef: MyTestClass, property: KProperty<*>): String {
return "aaa"
}
}
}
private fun checkProperty(thisRef: MyUI, name: String) { …… }
}
fun <T> bindResource(id: ResourceID<T>): ResourceLoader<T> { …… }
class MyUI {
val image by bindResource(ResourceID.image_id)
val text by bindResource(ResourceID.text_id)
}
class ResourceID() {
val image_id: String = "2345715"
val text_id: String = "35678412"
}
上面这一段是从菜鸟教程中复制过来的,代码部分添加了创建委托这一段,提供委托的功能很明确,只是我个人在看这段代码时出现了一些疑惑,故在此记录一下
prop.name,此处prop指的是被委托属性对象,因此prop.name就是属性的名称,在 checkProperty(thisRef, prop.name)中即可自行检查属性一致性,检查无误后,即可通过返回的getValue完成属性委托