如何为KMutableProperty参数赋值?

Zzo*_*okk 4 kotlin

在一个方法中,我希望接收KMutableProperty作为参数并为其赋值.

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

基本上我想有类似的东西:

class MyBinder {
  ...

  fun bind(property: KMutableProperty<Int>): Unit {
     property.set(internalIntValue)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在另一个类中调用它

  myBinder.bind(this::intProperty)
Run Code Online (Sandbox Code Playgroud)

Ale*_*lov 5

Kotlin 1.0不允许使用this::intProperty语法,但目前正在使用它,并且很快就可以作为1.1(问题,KEEP提案)的早期访问预览的一部分.

考虑到这一点,我会考虑以另一种方式做你正在描述的事情,例如bind接受一个设置属性的lambda:

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

...

myBinder.bind { intProperty = it }
Run Code Online (Sandbox Code Playgroud)

无论如何,要回答你关于设置值的问题KMutableProperty:设置某些属性的值,或者从技术上讲,调用属性setter,你应该知道它的arity,或者属性的参数个数(及其getter/setter)接受.在文件中声明的属性不接受任何参数,成员属性和扩展属性需要一个参数(接收器实例),而也是扩展的成员属性需要两个参数.这些种类的属性由以下亚型表示KMutableProperty分别为:KMutableProperty0,KMutableProperty1,KMutableProperty2-装置的数量的元数和它们的一般类型参数意味着类型的接收器.每个属性类型都有一个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)
}
Run Code Online (Sandbox Code Playgroud)

请注意,抽象接口中没有set(或get)方法,KMutableProperty因为不可能声明它,不知道所需接收器参数的数量.