kotlin - 如何为 KMutableProperty 参数赋值?

标签 kotlin

在一种方法中,我想接收 KMutableProperty 作为参数并为其赋值。

另一个问题是将参数传递给这种方法的正确方法是什么。

基本上我想要这样的东西:

class MyBinder {
  ...

  fun bind(property: KMutableProperty<Int>): Unit {
     property.set(internalIntValue)
  }
}

然后在另一个类中调用它
  myBinder.bind(this::intProperty)

最佳答案

Kotlin 1.0 不允许 this::intProperty语法,但目前正在工作中,并将很快作为 1.1 早期访问预览的一部分提供( issueKEEP proposal )。

考虑到这一点,我会考虑以另一种方式执行您所描述的操作,例如制作 bind接受一个设置属性的 lambda:

class MyBinder {
    fun bind(setProperty: (Int) -> Unit) {
        setProperty(internalIntValue)
    }
}

...

myBinder.bind { intProperty = it }

无论如何,回答您关于设置 KMutableProperty 值的问题: 要设置某个属性的值,或者从技术上讲,调用属性 setter ,您应该知道它的数量,或者该属性(及其 getter/setter)接受的参数数量。文件中声明的属性不接受任何参数,成员属性和扩展属性需要一个参数(接收器实例),而扩展的成员属性需要两个参数。这些属性由 KMutableProperty 的以下子类型表示分别为:KMutableProperty0 , KMutableProperty1 , KMutableProperty2 -- 数字表示arity,它们的泛型类型参数表示接收者的类型。这些属性类型中的每一个都有一个 set方法和相应的参数。一些例子:
fun setValue(property: KMutableProperty0<Int>, value: Int) {
    property.set(value)
}

fun setValue(property: KMutableProperty1<SomeType, Int>, instance: SomeType, value: Int) {
    property.set(instance, value)
}

注意没有set (或 get )摘要中的方法 KMutableProperty接口(interface)正是因为它不可能声明它,不知道所需的接收器参数的数量。

关于kotlin - 如何为 KMutableProperty 参数赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751966/

相关文章:

scala - Kotlin 序列会缓存中间结果吗?

android - 对于用作表达式的 Kotlin 函数,有没有简洁的操作和返回值的方式?

kotlin - 在 Kotlin 中定义数组类型

java - 所有 Activity 中都可用的选项菜单

Android测试用例等待10分钟后才能在debug模式下调试

unit-testing - 无法从仅 jvm 模块访问 commonMain 多平台类

Kotlinc 命令行错误

android - Android按钮点击事件的Kotlin协程流程示例?

variables - 在Kotlin中明确指定类型与未明确指定类型之间有什么区别?

android - 记住当jetpack compose中的值发生变化时不要重新组合