首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为KMutableProperty参数赋值?

如何为KMutableProperty参数赋值?
EN

Stack Overflow用户
提问于 2016-06-10 15:29:38
回答 2查看 3K关注 0票数 4

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

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

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

代码语言:javascript
复制
class MyBinder {
  ...

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

然后在另一个类中调用它

代码语言:javascript
复制
  myBinder.bind(this::intProperty)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-10 16:01:41

Kotlin1.0不允许this::intProperty语法,但目前正在使用,并且将作为早期访问预览1.1 (问题保留建议)的一部分提供。

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

代码语言:javascript
复制
class MyBinder {
    fun bind(setProperty: (Int) -> Unit) {
        setProperty(internalIntValue)
    }
}

...

myBinder.bind { intProperty = it }

无论如何,要回答有关设置KMutableProperty值的问题:要设置某些属性的值,或者从技术上讲,要调用属性设置器,您应该知道它的重要性,或者属性(及其getter/ setter )接受的参数数。文件中声明的属性不接受任何参数,成员属性和扩展名属性需要一个参数(接收方实例),而同时也是扩展的成员属性需要两个参数。这类属性分别由KMutableProperty的以下几个子类型表示:KMutableProperty0KMutableProperty1KMutableProperty2 --数字表示的是对称性,它们的泛型参数表示接收机的类型。这些属性类型中的每一种都有一个具有相应参数的set方法。下面是一些例子:

代码语言:javascript
复制
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)接口中没有任何方法,这正是因为不可能声明它,不知道所需的接收方参数的数量。

票数 5
EN

Stack Overflow用户

发布于 2016-06-10 16:32:06

除了Alexander的回答之外,您还可以尝试这样的方法:

代码语言:javascript
复制
import kotlin.reflect.KMutableProperty

class Binder {
  val internalIntValue = 10

  fun bind(self: Any, aProperty: KMutableProperty<Int>) {
    aProperty.setter.call(self, internalIntValue)
  }
}

class Foo {
  var bar = 1

  fun changeBar() {
    Binder().bind(this, Foo::bar)
  }
}

fun main(args: Array<String>) {
  val foo = Foo()

  assert(1 == foo.bar)

  foo.changeBar()

  assert(10 == foo.bar)
}

一种更稳健/更安全的方法来做同样的事情:

代码语言:javascript
复制
fun <T> bind(self: T, aProperty: KMutableProperty1<T, Int>) {
  aProperty.set(self, internalIntValue)
}

感谢亚历山大。他的回答给了我以前的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37751966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档