需要注意的是,無論生成器是否生成一個類型,它都會將該類型包裝爲可選項。
的GeneratorType
協議聲明它稱之爲Element
相關聯的類型和方法,next()
,其返回類型是Element?
型。無論Element
是什麼,next()
都將其包含在一個可選項中(並記住,可選僅僅是一個枚舉)。
因此,一個生成可選項的生成器將這些可選項包裝在另一個可選層中。
考慮以下幾點:
let array: [Int?] = [1, 2, nil, 4, nil, nil, 7, 8, nil, nil, 11]
這是可選的整數數組。
因此,如果我們在該陣列上調用generate()
,它會給我們返回類型Optional<Optional<Int>>
或Int??
從next()
方法。
前兩個電話給next
會給我們值(1,然後2)。第三個就是返回nil
:
但實際上這僅僅是誤導性的信息。實際上,第三回居然是這樣的:Optional.Some(nil)
我們可以看到,還有更多的值通過看這個while
循環,這是由真正nil
是11後產生終止生成:
所有nil
值,我們看到打印的實際上是Optional.Some(nil)
,當next()
調用最後返回Optional.None
,循環終止。
我們正在尋找在這裏是以下三個值可能值之間的差異:
let optionalSomeValue: Int?? = 3
let optionalSomeNil: Int?? = Optional.Some(nil)
let optionalReallyNil: Int?? = nil
注意,第二行也可以寫成:
let optionalSomeNil: Int?? = Optional.Some(Optional.None)
在結束當然,我們必須記住,可選只是一個普通枚舉:
enum Optional<T> {
case Some(T)
case None
}
對於什麼T
可以是沒有限制的,這意味着它本身可以是可選的,並且對於案例None
可以是可選的。
在斯威夫特的nil
關鍵詞僅僅是Optional<T>.None
方便的快捷方式和?
語法聲明自選同樣爲Optional<T>.Some
方便快捷。認爲下面的兩行是在每一個方式等效除了變量名:
let foo = Optional<Int>.None
let bar: Int? = nil
下面是一個例子:http://stackoverflow.com/questions/25794849/is-it-possible-對實施-A-迅速-序列類型,也就是說,包含比零元素。 –
相關:[可選綁定無文字與變量,在Swift中爲零](http://stackoverflow.com/q/26613195/2792531) – nhgrif