Question

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

Was it helpful?

Solution

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

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top