对于这个问题,我有一个解决方法,其中涉及将变量重新分配给它自己。但是,这似乎并不有效。
fun main() {
val x = Example1()
x.listOfInt = mutableListOf(3,4)
x.listOfInt.add(455)
}
class Example1 {
var listOfInt: MutableList<Int> = mutableListOf()
set(value) {
println("setting it here to value => $value")
field = value
}
}
// It only prints:
// setting it here to value => [3, 4]
如您所见,附加值会有效地更改集合的值,但不会触发设置器。有更好的方法吗?
以下是Kotlin的playground上的代码的链接
这对我来说很奇怪,因为下面的Swift中类似的代码可以在添加数组时执行预期的操作:
import Foundation
class Example1 {
var fieldProperty: Int = 0
var listOfInt: [Int] = [] {
didSet {
print("setting it here to value => \(listOfInt) vs oldValue: \(oldValue)")
}
}
}
let x = Example1()
x.listOfInt = [3,4]
x.listOfInt.append(455)
// this prints:
// setting it here to value => [3, 4] vs oldValue: []
// setting it here to value => [3, 4, 455] vs oldValue: [3, 4]
我知道我可能会比较苹果和橙子,但是我很好奇是否有更好的解决方案。
答案 0 :(得分:0)
使用set(value) { }
等效于对该变量实施setter。
您提供的代码可以解释为:
class Example1 {
var listOfInt: MutableList<Int> = mutableListOf()
fun set(value: MutableList<Int>) {
println("setting it here to value => $value")
this.listOfInt = value
}
}
当您调用x.listOfInt.add(455)
时,您是在add
的{{1}}实例中定义的列表上调用x
方法。
尝试致电Example1
,您会看到您的二传手将被正确呼叫。
要实现您要执行的操作,有几种方法:
x.listOfInt = mutableListOf(1,2,3)
的新版本,该版本将覆盖方法MutableList<>
(此可能可能会过大)。在您的add
类中创建一个add
方法,如下所示:
Example1
您的主菜单现在看起来像这样:
fun add(value: Int) {
println("adding value to list => $value")
listOfInt.add(value)
}