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
*/