gpt4 book ai didi

swift - Element 为 Optional 的 Generators 如何知道它们何时到达终点?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:08 25 4
gpt4 key购买 nike

swift GeneratorType引用说明了 next 方法:

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("...").

如果生成器用于 Optional 类型,则它有可能在到达序列末尾之前达到 nil 值。在这种情况下,Swift 如何知道它没有到达终点?

最佳答案

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

GeneratorType协议(protocol)声明了它调用的关联类型 Element和一个方法,next() ,其返回类型为 Element? 类型.随便Element是,next()将它包装在一个可选的(记住,可选只是一个枚举)。

因此生成可选值的生成器将这些可选值包装在另一个可选层中。

考虑以下几点:

let array: [Int?] = [1, 2, nil, 4, nil, nil, 7, 8, nil, nil, 11]

这是一个可选整数数组。

所以如果我们调用 generate()在这个数组上,它会给我们一些返回类型 Optional<Optional<Int>> 的东西或 Int??来自 next()方法。

enter image description here

前两次调用 next会给我们值(1,然后 2)。第三个看起来像返回 nil :

enter image description here

但实际上这只是误导性信息。实际上,第三个返回实际上是这样的:Optional.Some(nil)

通过查看这个 while,我们可以看到有更多的值可以生成循环,由 real nil 终止11点后生成:

enter image description here

所有 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可以,这意味着它本身可以是可选的,并且它可以是可选的 None .

在 Swift 中,nil关键字只是 Optional<T>.None 的便捷快捷方式和 ?声明可选值的语法同样是 Optional<T>.Some 的便捷快捷方式.考虑以下两行除了变量名之外在所有方面都是等价的:

let foo = Optional<Int>.None
let bar: Int? = nil

enter image description here

关于swift - Element 为 Optional 的 Generators 如何知道它们何时到达终点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36253204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com