- 如果
obj
不存在obj?
生成nil
所以obj?.attr
也是如此。 - 如果
obj
爲零,則obj!.attr
崩潰。
但是如果我肯定obj
在那個代碼的某個點總是存在的,對我來說似乎是獨立使用哪一個。我對嗎?你使用什麼樣的編碼風格?什麼時候使用obj!.attr和obj?.attr?
obj
不存在obj?
生成nil
所以obj?.attr
也是如此。obj
爲零,則obj!.attr
崩潰。但是如果我肯定obj
在那個代碼的某個點總是存在的,對我來說似乎是獨立使用哪一個。我對嗎?你使用什麼樣的編碼風格?什麼時候使用obj!.attr和obj?.attr?
我個人認爲,如果你確定存在obj,你可以使用!要麼 ?無論是。它們對現有對象產生相同的效果。唯一的問題是編譯器:有時可以使用!而不是?,有時不是。
無論如何,如果你想進一步閱讀,請給蘋果「The Swift Programming Language」的免費書籍提供一個機會:這些東西在那裏很好解釋!
他們不一樣。 'obj?.attr'總是返回一個可選項,然後你不得不擔心解包。如果'attr'是''obj!.attr'只是一個可選項。 – vacawama 2014-09-19 11:07:10
@vacawama:我知道,但這不是問題。如果你確定obj存在,編譯器會讓你使用?要麼 !沒有任何區別。 – MrAsterisco 2014-09-20 12:01:49
看看我的例子。即使存在「obj」,也是有區別的。 – vacawama 2014-09-20 20:10:17
如果obj
存在,即使attr
不是可選項,obj?.attr
也會返回可選類型。另一方面,obj!.attr
將是什麼類型attr
是,因此如果attr
是非可選的,則不需要額外的解包。
考慮這個例子:
class Person {
var age = 37
}
var fred: Person? = Person()
let ageNextYear = fred?.age + 1 // error: value of optional type Int? not unwrapped
let ageLastYear = fred!.age - 1 // this works
您使用?當你創建一個變量而沒有給它一個值時,這意味着它可以存在並且在單元化狀態下使用。只要它沒有被初始化,它就沒有與之關聯的類型。
它與零值沒有關係。
由於Swift是類型安全的,它需要所有變量和常量默認保持一個值,這意味着它們有一個類型。所以定義一些東西?要麼 !在它周圍放置一個包裝。
enum Optional {
case None
case Some(T)
}
正如你看到的,要麼有型與否。沒有(如果可能的話)或沒有與它無關。但是沒有關聯的類型通常都是零。
當你處理一個被聲明爲可選的變量的值時,你需要使用!否則你會使用上面顯示的枚舉。
展開意味着您可以斷言它確實保存了一個值,這意味着它有一個類型。它將其從枚舉中提取出來,並將其作爲一種類型呈現出來。
關於編碼風格,你通常只需要聲明一些東西?當您使用C或Objective-C API時。在純Swift中,你通常不會聲明某些東西是可選的。
您可能需要使用!即使在某些可能未被定義的情況下,也可以用純粹的速度。例如,你有多維數組被初始化爲空。這是因爲Swift當前如何處理真正的多維對象,其中較高維度是隱式可選項。
TL; DR:請勿使用?除非你被迫在處理C/Obj-C API時。當使用用?聲明的變量的值時總是使用!指的是價值而不是?
是詳細介紹了發生的事情有些鏈接:
http://www.drewag.me/posts/what-is-an-optional-in-swift
http://www.drewag.me/posts/uses-for-implicitly-unwrapped-optionals-in-swift
他們是不一樣的。 'obj?.attr'總是返回一個可選項,然後你不得不擔心解包。如果'attr'是''obj!.attr'只是一個可選項。 – vacawama 2014-09-19 11:11:56