2017-07-25 34 views
1

根據對String爲什麼編譯器告訴我,我需要解開一個布爾(非可選?)

財產isEmptyBool的雨燕頭(不可選的吧?)

public var isEmpty: Bool { get } 

但在我的代碼,當我嘗試寫:

!sender.titleOfSelectedItem?.isEmpty 

值可選類型的沒有打開,你的意思是使用「?」 或「!」

爲什麼編譯器認爲isEmpty是可選的?

是否因爲包含該屬性的對象當前是可選的?

titleOfSelectedItemString?

還是我只是失去了一些東西完全,在這裏?

回答

4

sender.titleOfSelectedItem?.isEmpty可選鏈和有型Bool?,因爲它可以返回nil如果titleOfSelectedItemnil

您應該決定如何處理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 
} 
+0

所以任何適當的鏈接時可選的ty是否可選?我想我只是假設可選綁定發生時,它發現接收器(可選)爲零,並且不會打擾檢查鏈中的屬性 –

+0

該屬性不會成爲可選項。可選鏈的結果是可選的。如果鏈條中的任何鏈接是'nil',則鏈條斷開並返回'nil'。因爲鏈可能有'nil'作爲可能的結果,結果的類型必須是可選的,因爲只有一個可選項可以是'nil'。這是*可選鏈接*。可選綁定是'如果讓變量=可選表達式'。您可以將兩者結合使用,因爲*可選表達式*可以是*可選鏈*。 – vacawama

+0

啊好吧,現在完全得到它,混淆了可選鏈和可選綁定。感謝您的解釋! –

相關問題