元素是可选的生成器如何知道何时到达终点?

Bal*_*Ben 4 swift

Swift GeneratorType参考说明了该next方法:

next() 前进到下一个元素并返回它,如果不存在下一个元素,则返回nil.

然后在讨论中说

要求:自next()复制完成self以来未应用于副本,并且未self.next()返回任何先前的调用nil.鼓励该协议的特定实现通过调用来响应违反此要求的行为preconditionFailure("...").

如果Generator是可选类型,那么它可以nil在到达序列结束之前达到一个值.Swift如何知道它在这种情况下还没有达到目的?

nhg*_*rif 8

重要的是要注意,无论生成器生成什么类型​​,它都会将该类型包装在可选项中.

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)

在此输入图像描述

  • 请不要在你的代码中加上`!`.你不是绝地武士. (3认同)