if语句中的Swift选项行为

时间:2016-01-13 22:21:49

标签: ios swift

我有一个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

有什么想法吗?帮助我提高对选项的理解。

1 个答案:

答案 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)")
}