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

Swift GeneratorType参考文献说明了下一个方法:

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 of self since the copy was made,and no preceding call to self.next() has returned nil. Specific implementations of this protocol are encouraged to respond to violations of this requirement by calling preconditionFailure("...").

如果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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...