Ios 计算的属性值未更新
我在我的Ios 计算的属性值未更新,ios,swift2,Ios,Swift2,我在我的ViewController中定义了一个计算属性num: class ViewController: UIViewController { var myArr:[Int]{ get { return [1,2,3] } } var num: Int{ get { return myArr.count } set {} } fun updateState(
ViewController
中定义了一个计算属性num
:
class ViewController: UIViewController {
var myArr:[Int]{
get {
return [1,2,3]
}
}
var num: Int{
get {
return myArr.count
}
set {}
}
fun updateState() {
num--
// why num is 3 here? why not 2?
print(num)
}
...
}
当我调用
updateState()
函数时,它首先num--
,然后打印出num
,但它给出的是3而不是2。为什么?您还没有实现setter。因此num总是返回数组的计数。它始终是3。num
将始终是3,因为它是一个计算属性,其值取自文本数组的长度。在当前代码中更改num
的唯一方法是更改myArray
的大小
计算属性的get
方法用于确定其值,而不仅仅是其初始值,因此num--
在这种情况下实际上毫无意义
因此,根据您的要求,num
最初是数组的大小,但随后可以修改,您将需要一个存储的属性来跟踪当前值和一个setter方法:
class ViewController: UIViewController {
var trackingNum:Int?
var myArr:[Int]{
get {
return [1,2,3]
}
}
var num: Int{
get {
if self.trackingNum == nil {
self.trackingNum=self.myArr.count
}
return self.trackingNum
}
set {
self.trackingNum=newValue
}
}
func updateState() {
num--
print(num)
}
...
}
您可以将
num
属性设置为惰性,以使其具有数组计数的初始值,并且仍然能够像预期的那样减小它
lazy var num: Int = { [unowned self] in
return self.myArr.count
}()
在您第一次引用
num
时,它将有一个数组计数的初始值。我如何实现setter以使我的代码按预期工作?我无法回答这个问题,因为num是数组中的元素数。是否要在执行num--
时从数组中删除元素?否,我不想从该数组中删除元素。在这种情况下,num
的getter错误。也许您应该用存储属性替换计算属性,并将其初始值设置为数组的计数。如何使我的代码仍然使用计算属性?嗯,num的值应该是多少?您希望它最初是3吗?减少num
是否应该对数组做些什么?属性上的操作的语义是什么?我需要num最初是该数组中元素的数量&我不想从该数组中删除任何内容,但我仍然希望num--
工作。但是为什么要使用计算属性呢?您正在模拟存储属性的行为。完全正确。整个问题没有多大意义;可以计算属性,也可以直接对其进行操作。整个问题都可以通过存储属性和init
方法来解决。即使使用文字数组也没有多大意义。请参阅我的答案。行为相同,语法更清晰。
class C {
var myArr:[Int]{
get {
return [1,2,3]
}
}
lazy var num: Int = self.myArr.count
func updateState() {
num--
print(num)
}
}
let c = C()
c.updateState()
c.updateState()
c.updateState()
// ... prints
/*
2
1
0
*/