Can't unwrap Optional.None error in swift

2019-04-10 05:37发布

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

标签: ios swift ios8
2条回答
做自己的国王
2楼-- · 2019-04-10 06:02

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
查看更多
Bombasti
3楼-- · 2019-04-10 06:16

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.

查看更多
登录 后发表回答