【问题标题】:Can't unwrap Optional.None error in SwiftSwift 中无法打开 Optional.None 错误
【发布时间】:2014-06-04 10:44:00
【问题描述】:

当为 UILabel 传递值时,会出现错误:

无法打开 Optional.None

源代码:

@IBOutlet var rowLabel : UILabel

var row: String? {
    didSet {
        // Update the view.
        println(row)
        rowLabel.text = row
    }
}

当我使用新含义时,UITable 模板的标签中也会出现错误:

让 myCell : Cell = Cell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell") myCell.myLabel.text = "(indexPath.row)"

【问题讨论】:

  • 是编译时错误吗?
  • 否,运行时:线程 1:EXC_BAD_instruction(code=EXC_1186_INVOP, subcode=0x0)
  • 我编辑了我的答案,看看吧。
  • 你必须用 !操作员。试试“rowLabel.text = row!”

标签: ios swift ios8


【解决方案1】:

rowOptional,也可以是nil,即Optional.None,所以需要在赋值前解包。

如果你不这样做,我猜运行时无论如何都会尝试解包它,但只要遇到 nil 值,它就会失败并出现该错误。

这样的东西应该是安全的

if let r = row {
   rowLabel.text = r    
}

如果rownil,则永远不会被分配。

【讨论】:

  • 值来了,我进入状态,所以继续落在文本分配上
  • 当您在if 条件的then 分支内时,rrow 的展开值。它明确避免 r 成为 nil
  • 这对以后有帮助,谢谢,但是值不是nil会继续崩溃
【解决方案2】:

你必须在 willSet 块中使用 newValue,在 didSet 块中使用 oldValue

示例:

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"

输出:

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

【讨论】:

  • willSet 总是返回 nil
  • 在 viewDidLoad 值被传递给 willSet。非常感谢))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多