我做的事情很奇怪,但我有短暂的感觉,应该有可能。
使用Kotlin可以进行以下操作吗? (它可以编译但不起作用)
var delegatedProp: (Int) -> Unit by Delegates.observable({ a-> Unit }) { _, _, newVal ->
//This is never raised
//Secondly how should I access the given Int ?
//newVal.a doesn't seem to compile
}
我的主意是,一旦我调用了proxyedProp(10),可观察对象就会被调用,并且我将能够访问newVal.a。
这将成功编译,但不会调用可观察对象
答案 0 :(得分:2)
当您设置delegatedProp
(即
x.delegatedProp = { print(it) }
({{ print(it) }
只是类型(Int) -> Unit
的示例)。 newVal
将是您将属性设置为的函数,在本例中为{ print(it) }
。因此它没有.a
。
如果您想在调用delegatedProp(10)
时做点什么,只需...将这些操作放入函数中即可。
val delegatedProp: (Int) -> Unit = { a -> /* do whatever you wanted to do with newVal.a */ }
如果您希望delegatedProp
成为var
,但又想继续执行分配给您的“额外”操作,则最简单的方法可能是自定义获取方法:
var delegatedProp: (Int) -> Unit = { a -> Unit }
get() = { a ->
/* whatever you want to do with a */
field(a)
}
或setter:它不会在每次访问时都创建一个新的lambda,但是要么重复一些代码,要么至少需要显式设置一次,并且不仅要初始化。