5

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

4

2 回答 2

3

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.

于 2014-06-04T11:00:10.873 回答
1

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
于 2014-06-04T11:02:34.150 回答