"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 withinwillSet
andoldValue
works fordidSet
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
andoldValue
for thewillSet
anddidSet
property observers, respectively.