Swift GeneratorType参考说明了该next方法:
next()前进到下一个元素并返回它,如果不存在下一个元素,则返回nil.
然后在讨论中说
要求:自
next()复制完成self以来未应用于副本,并且未self.next()返回任何先前的调用nil.鼓励该协议的特定实现通过调用来响应违反此要求的行为preconditionFailure("...").
如果Generator是可选类型,那么它可以nil在到达序列结束之前达到一个值.Swift如何知道它在这种情况下还没有达到目的?
重要的是要注意,无论生成器生成什么类型,它都会将该类型包装在可选项中.
该GeneratorType协议声明它调用的关联类型Element和方法next(),其返回类型是类型Element?.无论Element是什么,next()将它包装在一个可选的(记住,可选只是一个枚举).
因此,生成选项的生成器将这些选项包装在另一个可选层中.
考虑以下:
let array: [Int?] = [1, 2, nil, 4, nil, nil, 7, 8, nil, nil, 11]
Run Code Online (Sandbox Code Playgroud)
这是一个可选整数数组.
所以,如果我们称generate()这个阵列上,它会给我们的东西,返回类型Optional<Optional<Int>>或Int??从next()方法.
前两个调用next将给出我们的值(1,然后是2).第三个看起来像它返回nil:
但实际上这只是误导性的信息.实际上,第三个回报实际上是这样的:Optional.Some(nil)
我们可以看到,通过查看此while循环可以生成更多值,该循环由11之后生成的实际 终止nil:
nil我们看到的所有值都是实际打印的Optional.Some(nil),当next()调用最终返回时Optional.None,循环终止.
我们在这里看到的是以下三个值可能值之间的差异:
let optionalSomeValue: Int?? = 3
let optionalSomeNil: Int?? = Optional.Some(nil)
let optionalReallyNil: Int?? = nil
Run Code Online (Sandbox Code Playgroud)
请注意,第二行也可以写为:
let optionalSomeNil: Int?? = Optional.Some(Optional.None)
Run Code Online (Sandbox Code Playgroud)
在一天结束时,我们必须记住,optional是一个通用的枚举:
enum Optional<T> {
case Some(T)
case None
}
Run Code Online (Sandbox Code Playgroud)
对T可能的内容没有任何限制,这意味着它本身可以是一个可选的,并且它可以是一个可选的case None.
在Swift中,nil关键字只是一个方便的快捷方式,声明选项Optional<T>.None的?语法同样是一个方便的快捷方式Optional<T>.Some.考虑以下两行除了变量名之外的每种方式都是等效的:
let foo = Optional<Int>.None
let bar: Int? = nil
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |