2015-03-13 40 views
5

我明白「!」要麼 」?」作品。但是我不太確定與!=無檢查相比,增加的好處是什麼。移到「!?」的附加好處是什麼? 我覺得這只是蘋果增加的功能,但與iOS的現狀相比,並不能真正看到額外的好處。 我在這裏錯過了什麼嗎? 在此先感謝。Swift,可選包裝。 「?」 「!」我明白它是如何工作的。但爲什麼它比!=無檢查

+2

爲什麼每次使用變量時都要檢查nil,我可以聲明它是不可選的,並且可以肯定它永遠不會是nil? – 2015-03-13 16:04:03

+0

編寫更短,更易讀的代碼更方便。它不是典型的Swift,但也可用於其他語言,如Groovy。 – 2015-03-13 16:44:30

回答

5

檢查零和需要可選的解包之間的區別可以等於你的代碼崩潰或不崩潰之間的差異。如果使用正確的選項,可以提高安全性使您的代碼更具可讀性。

假設你有一個數組,並且你想獲得它的第一個值。你可能不喜歡這樣:

if !arr.isEmpty { 
    useValue(arr[0]) 
} 

但當然,人們很容易忘記,isEmpty一部分,如果你這樣做,你的代碼將與越界 - 錯誤崩潰。

所以這一翻譯,還有一個更好的方法:使用數組的first方法,如果數組是空的,它返回一個可選的nil

if let val = arr.first { 
    useValue(val) 
} 

有了這種形式,你無法得到這個錯誤。如果不解開它,就不可能使用這個值。如果你忘記了,你會得到一個編譯錯誤。它也更易讀我的眼睛/

想必你會期望你的!= nil制定的工作是這樣的:

if arr.first != nil { 
    // all optionals would be 「implicit」 
    useValue(arr.first) 
} 

暫且不論,我們在調用.first兩次這是一個有點效率低下,問題的類型兼容性,基本上這讓你回到原點 - 你可以忘記做nil比較,然後,kaboom。或者,你可以採用Objective-C方法,並說nil可以發送消息 - 但這也會導致各種混淆(我個人討厭隱式發送消息的意思是無意義的),還有導致了這個問題,當函數返回一個值類型時,你會怎麼做,如Int。一切都可以爲空嗎?這導致了Obj-C地塊的混亂。

更重要的是,也有可以當你正在處理自選,如零 - 結合介紹各種便利:

// default to 0 if no first element 
arr.first ?? 0 
// much neater than this equivalent form: 
arr.first != nil ? arr.first : 0 

或可選的比較:

// will only be true if arr is non-nil and zero 
if arr.first == 0 { 

} 

更多的例子, ,請參閱this answer

+0

也許你對null合併不瞭解的東西:在objective-c中沒有太大的不同。可以忽略「true」參數以形成略微不同的語法空合併運算符。例如'id element = array [0]?:defaultValue;' – 2015-05-26 23:14:26

+0

爲什麼不能直接寫'id first = arr.first;如果(first!= nil){...}'在Objective-C中?那麼它不會先打兩次。當您發佈軟件時,您需要進行測試以確保其在開發過程中不會崩潰,如果有,則在開發過程中對其進行修復。當你到達發佈階段時,你的代碼是相當自信的,沒有一堆'如果讓var = something {...}'亂丟你的方法,使你的客觀c方法變得更好和更短。 – Zhang 2016-07-22 03:12:10

5

?操作非常方便,當談到鏈接,例如:

a?.b?.c?.doSomething() 

否則,你就必須檢查abcnil,這可能導致更多的不可讀的代碼要比鏈接呢。

另一件事是,你可以很容易地標記參數是可選的,例如,

func someFunc(arg: Type?) 

,它是立即清楚,認爲這是其可以是nil一個類型,即語言強制執行此。否則,你會通過可能是nil的東西,你忘記檢查和體驗崩潰。

+0

啊,來吧... downvote?! – 2015-03-13 16:24:37

+0

我不認爲任何人低估了你的答案。這是一個非常好的答案。謝謝!! – shle2821 2015-03-13 16:36:49

+0

@ shle2821,sombody沒有。當你獲得足夠的積分時,你可以分別看到積極和失望的選票。 – 2015-05-26 23:15:43

相關問題