我有一个if语句,试图将房间的现有类型(String)(可能是nil)与UIPicker的房间类型列表进行比较。如果房间名称不存在,我们会自动将选择器设置为"其他"。
然而,即使满足条件,我也无法进入else if语句(房间是非零,类型是nil,而对于i的某个值,字符串是"其他" )。所需的行为是将pickerTypes行设置为" Other"的索引。但是,我们似乎跳过了else if语句而从未进入过。任何人都对选项或任何陈述有任何见解?
for var i=0; i<roomTypesCount; i++ {
let string = getName(i)
if string == self.room?.type {
self.pickerTypes.selectRow(i, inComponent: 0, animated: false)
}
else if self.room?.type == nil && string == "Other" {
self.pickerTypes.selectRow(i, inComponent: 0, animated: false)
}
}
getName()是一个返回NSString的目标c方法。 Room是一个核心数据对象,此时为nonnil,但其类型为nil。
这并没有进入if语句: 否则如果self.room?.type == nil&amp;&amp; string ==&#34;其他&#34; { 这样做。 否则,如果是self.room!.type == nil&amp;&amp; string ==&#34;其他&#34; { 这样做 否则如果self.room?.type == nil&amp;&amp;是{
在调试控制台中,我们得到了一些有趣的行为:
(lldb) po self.room?.type
nil
(lldb) po self.room!.type
fatal error: unexpectedly found nil while unwrapping an Optional value
fatal error: unexpectedly found nil while unwrapping an Optional value
nil
其他逻辑评估:
(lldb) po string == "Other"
true
(lldb) po self.room?.type == nil
true
(lldb) po self.room?.type == nil && string == "Other"
false
(lldb) po (self.room?.type == nil && string == "Other")
false
(lldb) po (self.room?.type == nil) && (string == "Other")
false
最后,如果我们只是将字符串声明为String类型,它就可以工作:
let string: String = getName(i)
在控制台中:
(lldb) po self.room?.type == nil && string == "Other"
true
有什么想法吗?帮助我提高对选项的理解。
答案 0 :(得分:2)
当您尝试访问可选属性时,首先需要检查是否存在可选值。由于self.room是可选的,因此您需要在尝试访问类型之前检查它是否存在。
if let room = self.room {
print("room is not nil")
if let type = room.type {
print("type is not nil")
} else if string == "Other" {
print("type is nil and string is Other")
} else {
print("type is nil but string is \(string)")
}
} else if string == "Other" {
print("room is nil and string is Other")
} else {
print("room is nil but string is \(string)")
}