2014-09-19 70 views
2
  • 如果obj不存在obj?生成nil所以obj?.attr也是如此。
  • 如果obj爲零,則obj!.attr崩潰。

但是如果我肯定obj在那個代碼的某個點總是存在的,對我來說似乎是獨立使用哪一個。我對嗎?你使用什麼樣的編碼風格?什麼時候使用obj!.attr和obj?.attr?

+0

他們是不一樣的。 'obj?.attr'總是返回一個可選項,然後你不得不擔心解包。如果'attr'是''obj!.attr'只是一個可選項。 – vacawama 2014-09-19 11:11:56

回答

2

我個人認爲,如果你確定存在obj,你可以使用!要麼 ?無論是。它們對現有對象產生相同的效果。唯一的問題是編譯器:有時可以使用!而不是?,有時不是。

無論如何,如果你想進一步閱讀,請給蘋果「The Swift Programming Language」的免費書籍提供一個機會:這些東西在那裏很好解釋!

+0

他們不一樣。 'obj?.attr'總是返回一個可選項,然後你不得不擔心解包。如果'attr'是''obj!.attr'只是一個可選項。 – vacawama 2014-09-19 11:07:10

+0

@vacawama:我知道,但這不是問題。如果你確定obj存在,編譯器會讓你使用?要麼 !沒有任何區別。 – MrAsterisco 2014-09-20 12:01:49

+0

看看我的例子。即使存在「obj」,也是有區別的。 – vacawama 2014-09-20 20:10:17

1

如果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 
0

您使用?當你創建一個變量而沒有給它一個值時,這意味着它可以存在並且在單元化狀態下使用。只要它沒有被初始化,它就沒有與之關聯的類型。

它與零值沒有關係。

由於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

相關問題