"oldValue" and "newValue" default parameters names inside willSet / didSet unrecognized

I am currently writing Swift 3 code in Xcode 8.

When using oldValue and newValue default parameters inside the willSet and didSet blocks, I am getting "unresolved identifier" compiler error.

I have a very basic code as below

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

Apple Documentation for Swift 3 still seems to support these feature. I hope I am not missing anything here?

You can also use vc:

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

The special variable newValue only works within willSet, while oldValue only works within didSet.

The property as referenced by its name (in this example vc) is still bound to the old value within willSet and is bound to the new value within didSet.

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

It's important to know that the special variable newValue only works within willSet, while oldValue only works within 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)") 
    }
}

You didn't try to initialize the variable with a new object by which you can set your clojure:

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

Comments
  • Not entirely right, oldValue still seems to be unrecognized. Removing viewController parameter seems to make it work.
  • From your answer, I was able to deduce that newValue works within willSet and oldValue works for didSet block given there are no custom parameters.
  • Yes, sorry. I did not notice ur variable.
  • Incidentally, docs.swift.org/swift-book/LanguageGuide/Properties.html documents the default parameter names of newValue and oldValue for the willSet and didSet property observers, respectively.