计算属性值未更新

时间:2016-02-25 20:13:39

标签: ios swift2

我在num中定义了计算属性ViewController

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.为什么?

4 个答案:

答案 0 :(得分:1)

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)
   }

   ...
}

答案 1 :(得分:1)

你可以使你的num属性变得懒惰,使其具有数组计数的初始值,并且仍然能够像你期望的那样递减它。

lazy var num: Int = { [unowned self] in
    return self.myArr.count
}()

在您第一次引用num

时,它将具有数组计数的初始值

答案 2 :(得分:0)

您尚未实施设定者。因此num始终返回数组的计数。这总是3。

答案 3 :(得分:0)

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