【发布时间】:2018-05-24 23:18:43
【问题描述】:
我已将名为“JournalEntry”的类型声明为可选类型并将其设置为 nil。然后,当 VC 加载时,我测试以确保在尝试使用对象之前已注入该对象,但我收到一条错误消息,提示“将 'JournalEntry' 类型的非可选值与 nil 进行比较总是返回 true”。
但我将它设置为可选并且为零...
代码如下:
class AddJournalEntryVC: UIViewController, UITextViewDelegate {
var willEdit:Bool?
var entryForEdit:JournalEntry? = nil
override func viewDidLoad() {
super.viewDidLoad()
if isEditing {
guard let entry = entryForEdit, entry != nil else{ //Comparing non-optional value of type 'JournalEntry' to nil always returns true
return
}
dateLabel.text = entry.dateString!
timeLabel.text = entry.timeString!
timestamp = entry.timestamp!
}
}
我的想法哪里出错了?谢谢。
【问题讨论】:
-
你刚刚解开了可选的。该值不能为零。它不再是可选的了。删除
, entry != nil,你会没事的。 -
那么简单地执行 'guard let entry = entryForEdit else {}' 将确保 entry 不为零?
-
'guard let entry = entryForEdit else {}' 正在询问“嘿 Swift,请检查 entryForEdit,如果你得到非 nil 的东西,请创建一个名为 entry 的常量。否则,做这些事情在 else 语句中。
-
@CodyLucas 是的,绝对是。使用
guard let entry = entryForEdit else展开将保证entry在guard之后使用时不为零。 -
就像
if let将可选项解包到其内部范围一样,guard let将其解包到封闭范围。因此,如果守卫检查通过,则 entry 被解包,不再是可选的,并且保证不会为 nil。如果它是 nil,你将输入守卫的 else 子句。