为什么编译器告诉我需要解包Bool(非可选?)

时间:2017-07-25 23:33:01

标签: swift optional

根据String

的Swift标题

属性isEmptyBool(不是可选的权利?)

public var isEmpty: Bool { get }

但在我的代码中,当我尝试写:

!sender.titleOfSelectedItem?.isEmpty
  

未打开的可选类型Bool?的值,是否意味着使用"?"   或"!"

为什么编译器认为isEmpty是可选的?

是否因为包含该属性的对象当前是可选的?

titleOfSelectedItemString?

或者我完全错过了什么,这里?

1 个答案:

答案 0 :(得分:8)

sender.titleOfSelectedItem?.isEmpty是一个可选链,其类型为Bool?,因为如果niltitleOfSelectedItem,它可以返回nil

您应该决定如何处理nil案例。您可以将可选链 nil合并运算符 ??结合使用,以安全地解包结果:

// treat nil as empty
let empty = sender.titleOfSelectedItem?.isEmpty ?? true

或者您可以将该值与false进行比较:

if sender.titleOfSelectedItem?.isEmpty == false {
    // value isn't nil and it isn't empty
}

或者您可以与true的值进行比较:

if sender.titleOfSelectedItem?.isEmpty == true {
    // value isn't nil and it is an empty String
}