2016-03-30 56 views
1

爲什麼這項工作:爲什麼可以用文字初始化?

let xxx : Optional<Int> = 1 

我意料的是,我不得不說,下面的(這也適用):

let xxx : Optional<Int> = .Some(1) 
+2

因爲語法糖。關於optionals的一切都是語法糖。 – nhgrif

+0

而且這裏所發生的任何事情都不會與從非文字的'Int'分配不同。在你的例子中,文字可能首先被轉換爲「Int」。但這並沒有特別改變這個問題。 – nhgrif

回答

2

The Swift Programming Language書由蘋果(重點是我的):

類型可選是枚舉有兩種情況,無和 一些(包裝),它們用於表示可能或不可以的值 存在。任何類型都可以明確聲明爲(或隱式地 轉換爲)可選類型。如果您在聲明可選變量或屬性時未提供初始值 ,則其值 自動默認爲零。

所以,在斯威夫特Optional<Wrapped>只是枚舉的特殊情況下,從任何類型的隱式轉換爲其定義,和你寫的線實際上等於。所以@nhgrif is right:它是一個語法糖。

UPDATE(from comments):由於賦值運算符不能被重載,所以在自定義枚舉中真的沒有辦法重複這種行爲。它是在一個方式語法糖:排序它「取代」 1.Some(1)nil.None,但它是一個「神奇的」語法糖確實如此。

+0

通常語法 – Verticon

+0

@RobertVaessen,謝謝,固定) – FreeNickname

+0

通常語法糖可以或者直接表達。例如,在上面的表達式中,我直接實例化可選項,而不是使用語法糖「let xxx:Int?= 1」。如何在沒有糖的情況下編寫字面賦值?我傾向於相信發生的事情是「魔術」。編譯器「知道」可選枚舉並給予特殊處理。我試圖做一些類似於我現在的枚舉,但不能。 – Verticon