【发布时间】:2019-10-13 09:46:40
【问题描述】:
我有一个解决这个问题的解决方案,它涉及将变量重新分配给它自己;但是,这似乎效率不高。
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]
我知道我可能会将苹果与橙子进行比较,但我只是好奇是否有更好的解决方案。
【问题讨论】:
-
附加值时有效地改变了集合的值,但它不会改变
listOfInt的值。当您将项目附加到列表时,列表的值不会改变。它与新项目相同。 -
只有在
Example1对象内重新分配变量listOfInt时才会调用set,而不是在调用该变量上的方法时调用,例如add()。 -
如果您不希望任何人在不使用 setter 的情况下更改
x引用的列表的内容,请不要使用可变列表。使用不可变的。
标签: kotlin