2016-03-27 49 views
4

雨燕GeneratorType參考說,有關的next方法:如果沒有下一個元素存在元素是否可選的生成器如何知道它們何時到達最後?

next()前進到下一個元素並返回它,或者爲零。

再討論,它說

要求:next()尚未應用於self副本,因爲副本做,並沒有self.next()前調用返回nil。鼓勵此協議的具體實施,通過致電preconditionFailure("...")來響應違反此要求的行爲。

如果發生器是可選類型,那麼它可能在達到序列結束前達到nil值。 Swift如何知道它在這種情況下還沒有達到目的?

+1

下面是一個例子:http://stackoverflow.com/questions/25794849/is-it-possible-對實施-A-迅速-序列類型,也就是說,包含比零元素。 –

+0

相關:[可選綁定無文字與變量,在Swift中爲零](http://stackoverflow.com/q/26613195/2792531) – nhgrif

回答

8

需要注意的是,無論生成器是否生成一個類型,它都會將該類型包裝爲可選項。

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()方法。

enter image description here

前兩個電話給next會給我們值(1,然後2)。第三個就是返回nil

enter image description here

但實際上這僅僅是誤導性的信息。實際上,第三回居然是這樣的:Optional.Some(nil)

我們可以看到,還有更多的值通過看這個while循環,這是由真正nil是11後產生終止生成:

enter image description here

所有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 

enter image description here

+0

謝謝,我已經立即瞭解了有關Swift的重要信息,並且稍微多了一點當我在我的代碼中加入'?'和'!'時通知我。 – TinyTimZamboni

+3

請不要在代碼中放入'!'。你不是絕地。 – nhgrif

相關問題