0

今天早上运行我的代码时遇到一个奇怪的错误。

致命错误:在展开可选值时意外发现 nil

这是我的简单对象:

class FQ {

    var rating: Float?
    var phone: String?

    init(rating: Float?, phone: String?)
    {
        self.rating = rating
        self.phone = phone
    }
}

但我在 if 语句 ( FQ.match() -> FQ?) 中测试 nil 值:

let fq: FQ? = FQ.match(self.place!.name, location: self.place!.location)

if fq != nil && fq!.phone != nil {
    self.phone.text = fq!.phone
} else {
    self.phone.text = ""
}

但是调试它:

fq 的打印描述:(project.FQ?) fq = Some {
rating = 6.0999999
phone = "+33 1 53 10 87 19"
}

该值不为零。使用电话号码设置标签值时调试器失败。

我以为我理解 Optional 但看起来我没有。我错过了什么?

4

3 回答 3

3

如果你说fq不是 nil,那么只有一个地方可以产生异常:

self.phone.text = fq!.phone

是(或类似的)self.phoneUILabel如果是,我认为这是一个隐式展开

@IBOutlet var phone: UILabel!

你确定它不是零?

于 2014-10-28T22:52:30.033 回答
1

这是一个误导性的错误信息。

我的插座在我看来是正确声明的,但不知何故 UI 和控制器之间的联系消失了。我认为它发生在 Git 合并之后。

我只需要将标签链接回选择我的电话插座变量的视图,现在一切正常。

谢谢大家,马克西姆

于 2014-10-29T00:08:30.433 回答
0

看来这fq.phone也是一个可选的,所以你不能将它分配给self.phone.text(我假设不是可选的)而不先打开它。尝试:

self.phone.text = fq!.phone!
于 2014-10-28T22:45:23.313 回答