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

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

概述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 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?? = 3let 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>.Nonelet bar: Int? = nil

总结

以上是内存溢出为你收集整理的swift – 元素是可选的生成器如何知道它们何时到达终点?全部内容,希望文章能够帮你解决swift – 元素是可选的生成器如何知道它们何时到达终点?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1047107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存