【发布时间】:2021-07-31 02:57:03
【问题描述】:
class test {
var _x : [Int]?
var x : [Int]? {
get {
return _x
}
set{
if let value = newValue {
for each in value {
_x!.append(each)
}
}
}
}
init() {
_x = [Int]()
x?.append(3)
}
}
var classTest = test()
classTest.x?.append(2)
print(classTest.x)
我得到 [3,3,2] 而不是 [3,2] 为什么我不明白?预期的行为是我们在 Initializer 中将 3 附加到 x,然后再附加 2。
编辑
感谢您的所有回复,尽管我仍然没有掌握这种行为的窍门。
所以当我做.append(2) 时,swift 会获取_x 的现有值,即3,然后将2 附加到它,然后将newValue 设置为[3,2]。我认为newValue 仅表示新值,即刚刚分配给计算属性的值。
【问题讨论】:
-
试试我的代码,看看会发生什么......
-
@dev_ios999 那么既然
newValue具有先前的值和附加的值,并且您为每个循环执行一次,那么预期的结果肯定是所有内容都会再次附加吗?如果您只想附加最新值,那么不要为每个循环执行一次,而只选择最后一个? (或者更好的是像建议的那样替换整个东西。) -
newValue是新的 array,它不仅仅是附加的值。如果一个值被删除,它会如何工作? -
“为什么
.append(2)应该将newValue设置为 2,但它也将现有值设置为 3”。好吧,这种行为是最有意义的。考虑要删除元素的情况 -remove(at: 0)。您正在通过这样做设置数组,因此将调用 setter,但是根据 your 逻辑,这次newValue会是什么?显然,将newValue设置为属性的整个新数组更有意义。 -
非常次要且不相关的观察。类型名称(例如结构、类等),总是首字母大写。所以,你可能想要
Test而不是test作为类名。
标签: ios swift computed-properties