我明白「!」要麼 」?」作品。但是我不太確定與!=無檢查相比,增加的好處是什麼。移到「!?」的附加好處是什麼? 我覺得這只是蘋果增加的功能,但與iOS的現狀相比,並不能真正看到額外的好處。 我在這裏錯過了什麼嗎? 在此先感謝。Swift,可選包裝。 「?」 「!」我明白它是如何工作的。但爲什麼它比!=無檢查
回答
檢查零和需要可選的解包之間的區別可以等於你的代碼崩潰或不崩潰之間的差異。如果使用正確的選項,可以提高安全性和使您的代碼更具可讀性。
假設你有一個數組,並且你想獲得它的第一個值。你可能不喜歡這樣:
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
也許你對null合併不瞭解的東西:在objective-c中沒有太大的不同。可以忽略「true」參數以形成略微不同的語法空合併運算符。例如'id element = array [0]?:defaultValue;' – 2015-05-26 23:14:26
爲什麼不能直接寫'id first = arr.first;如果(first!= nil){...}'在Objective-C中?那麼它不會先打兩次。當您發佈軟件時,您需要進行測試以確保其在開發過程中不會崩潰,如果有,則在開發過程中對其進行修復。當你到達發佈階段時,你的代碼是相當自信的,沒有一堆'如果讓var = something {...}'亂丟你的方法,使你的客觀c方法變得更好和更短。 – Zhang 2016-07-22 03:12:10
的?
操作非常方便,當談到鏈接,例如:
a?.b?.c?.doSomething()
否則,你就必須檢查a
,b
和c
爲nil
,這可能導致更多的不可讀的代碼要比鏈接呢。
另一件事是,你可以很容易地標記參數是可選的,例如,
func someFunc(arg: Type?)
,它是立即清楚,認爲這是其可以是nil
一個類型,即語言強制執行此。否則,你會通過可能是nil
的東西,你忘記檢查和體驗崩潰。
啊,來吧... downvote?! – 2015-03-13 16:24:37
我不認爲任何人低估了你的答案。這是一個非常好的答案。謝謝!! – shle2821 2015-03-13 16:36:49
@ shle2821,sombody沒有。當你獲得足夠的積分時,你可以分別看到積極和失望的選票。 – 2015-05-26 23:15:43
- 1. 異或在球拍,我不明白它是如何工作的
- 2. 可選閉包並檢查它是否
- 3. 什麼是未經檢查的演員,我如何檢查它?
- 4. CDOSYS:如何檢查它是否工作?
- 5. C語言:我不明白它爲什麼會起作用
- 6. 代碼工作正常,但我不明白它的打印
- 7. 它爲什麼會檢查和如何?
- 8. 我不明白如何在可可中使用代表,但我知道它們是什麼
- 9. 我想檢查網絡狀態,但它給我nullPointerException爲什麼?
- 10. jQuery UI的包括,不明白它爲什麼失敗
- 11. 計數排序 - 我知道它是如何工作的,但無法解決它
- 12. 什麼是十字隔間包裝紙?它是如何工作的?
- 13. Ext.net PageProxy:它是什麼,它是如何工作的?
- 14. MissingMethodException但我不明白爲什麼
- 15. PreparedStatement緩存 - 它是什麼意思(它是如何工作的)
- 16. 我是新來的android工作室,我不明白爲什麼它是這樣的
- 17. 什麼是Cometd?爲什麼它被使用和如何工作
- 18. 什麼是IOR文件,它是做什麼的,它是如何工作的?
- 19. 我不明白是什麼意思飢餓,因爲這作者解釋它
- 20. Jenkins的種子工作是什麼?它是如何工作的?
- 21. 這個logcat行是什麼意思?我總是看到它,但不明白
- 22. 我不明白爲什麼/如何CGAffineTransformTranslate工作
- 23. 我不明白爲什麼它的作品的CSS腳本,幫助我理解?
- 24. 意外;但我不明白爲什麼
- 25. EJB。什麼是它爲什麼存在以及它如何工作?
- 26. 我不明白爲什麼string.size返回它所做的
- 27. 剩餘 - 我的代碼不正確,但它爲什麼工作?
- 28. Interlocked如何工作,爲什麼它比鎖更快?
- 29. Python的插座網上聊天,我不明白Select.select()和它是如何工作
- 30. FileProvider正在打開PDF,但它是空白的。爲什麼?
爲什麼每次使用變量時都要檢查nil,我可以聲明它是不可選的,並且可以肯定它永遠不會是nil? – 2015-03-13 16:04:03
編寫更短,更易讀的代碼更方便。它不是典型的Swift,但也可用於其他語言,如Groovy。 – 2015-03-13 16:44:30