微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐