next()
Advance to the next element and return it,or nil if no next element exists.
然后在讨论中说
Requires:
next()
has not been applied to a copy ofself
since the copy was made,and no preceding call toself.next()
has returnednil
. Specific implementations of this protocol are encouraged to respond to violations of this requirement by callingpreconditionFailure("...")
.
如果Generator是可选类型,那么它可能在到达序列结束之前达到零值. Swift如何知道在这种情况下它还没有达到目的?
GeneratorType协议声明一个它调用Element的关联类型和一个方法next(),它的返回类型是Element?类型.无论是什么元素,next()都将它包装在一个可选中(记住,可选只是一个枚举).
考虑以下:
let array: [Int?] = [1,2,nil,4,7,8,11]
这是一个可选整数数组.
因此,如果我们在这个数组上调用generate(),它将为我们提供返回类型的东西Optional< Optional< Int>>或者Int ??来自next()方法.
前两个调用next将给出值(1,然后是2).第三个看起来像是返回nil:
但实际上这只是误导性的信息.实际上,第三个回报实际上就是这样:可选.有些(无)
我们可以看到,通过查看此while循环可以生成更多值,该循环由11之后生成的实际nil终止:
我们看到print的所有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)
在一天结束时,我们必须记住,optional是一个通用的枚举:
enum Optional<T> { case Some(T) case None }
T可以是什么没有限制,这意味着它本身可以是一个可选的,它可以是一个可选的案例无.
在Swift中,nil关键字只是Optional< T> .None和?的便捷快捷方式.声明选项的语法同样是Optional< T> .some的方便快捷方式.考虑以下两行除了变量名之外的每种方式都是等效的:
let foo = Optional<Int>.None let bar: Int? = nil