“oldValue”和“newValue”默认参数名称里面的willSet / didSet无法识别

时间:2016-09-18 15:15:10

标签: ios swift swift3

我目前正在Xcode 8中编写Swift 3代码。

oldValuenewValue块中使用willSetdidSet默认参数时,我收到"unresolved identifier"编译错误。

我有一个非常基本的代码,如下所示

var vc:UIViewController? {
    willSet {
        print("Old value is \(oldValue)")
    }
    didSet(viewController) {
        print("New value is \(newValue)")
    }
}
对于Swift 3来说,

Apple Documentation似乎仍然支持这些功能。 我希望我在这里不遗漏任何东西?

6 个答案:

答案 0 :(得分:39)

您还可以使用vc

var vc:UIViewController? {
    willSet {
        print("New value is \(newValue) and old is \(vc)")
    }
    didSet {
        print("Old value is \(oldValue) and new is \(vc)")
    }
}

答案 1 :(得分:13)

特殊变量newValue仅在willSet中有效,而oldValue仅在didSet中有效。

其名称所引用的属性(在本示例中为vc)仍然绑定到willSet中的旧值,并绑定到didSet中的新值。

答案 2 :(得分:12)

var vc:UIViewController? {
    willSet {
        print("New value is \(newValue)")
    }
    didSet {
        print("Old value is \(oldValue)")
    }
}

答案 3 :(得分:1)

您没有尝试使用可以设置clojure的新对象初始化变量:

var vc:UIViewController? = UIViewController(){
   willSet { 
       print("Old value is \(oldValue)")
   }
   didSet(viewController) {
       print("New value is \(newValue)")
   }
}

答案 4 :(得分:1)

重要的是要知道特殊变量newValue仅在willSet中有效,而oldValue仅在didSet中有效。

var vc: UIViewController? {
    willSet {
        // Here you can use vc as the old value since it's not changed yet
        print("New value is \(newValue)")
    }
    didSet {
        // Here you can use vc as the new value since it's already DID set
        print("Old value is \(oldValue)") 
    }
}

答案 5 :(得分:-1)

这就是为什么我们使用NSKeyValueObservation监视类对象的原因