When the value is passed for UILabel the error appears :
Can't unwrap Optional.None
source code:
@IBOutlet var rowLabel : UILabel
var row: String? {
didSet {
// Update the view.
println(row)
rowLabel.text = row
}
}
Also error appears in label in the template for UITable when I appropriate new meaning:
let myCell : Cell = Cell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
myCell.myLabel.text = "(indexPath.row)"
You must use newValue in willSet block, and oldValue in didSet block
example:
class foo {
var row: String? {
willSet {
println("will set value:")
println(newValue)
}
didSet {
println("did change value:")
println(oldValue)
}
}
}
var bar = foo()
println("First time setter called")
bar.row = "First value"
println("Second time setter called")
bar.row = "Second value"
output:
First time setter called
will set value:
First value
did change value:
nil
Second time setter called
will set value:
Second value
did change value:
First value
row
is an Optional
and it can be nil
, i.e. Optional.None
, so you need to unwrap it before assignment.
If you don't, I guess the runtime will try to unwrap it anyway, but it will fail with that error whenever a nil
value is encountered.
Something like this should be safe
if let r = row {
rowLabel.text = r
}
If row
is nil
, it will never be assigned.