枚举函数返回类型EnumerateGenerator。但是在Swift中,你可以使用它并分配给元组。EnumerateGenerator是如何变成元组的?
Definition: func enumerate<Seq : SequenceType>(seq: Seq) -> EnumerateGenerator<Seq.Generator>
for (index, value) in enumerate([1, 2, 3, 4, 5]) {
// How does EnumerateGenerator become a tuple?
}在EnumerateGenerator的定义中,元素被键入成一个元组,我是否正确地假设调用枚举()与调用EnumerateGenerator>next相同?
struct EnumerateGenerator<Base : GeneratorType> : GeneratorType, SequenceType {
typealias Element = (index: Int, element: Base.Element)
mutating func next() -> Element?
typealias Generator = EnumerateGenerator<Base>
func generate() -> EnumerateGenerator<Base>
}发布于 2014-09-01 19:58:06
来自Swift文档中的“为了-在声明”:
for-in语句允许对集合(或任何类型)中符合SequenceType协议的每个项执行一次代码块。 在集合表达式上调用generate方法以获得生成器类型的值,即符合GeneratorType协议的类型。程序通过调用流上的下一个方法开始执行循环。如果返回的值不是None,则分配给item模式,程序执行语句,然后在循环开始时继续执行。否则,程序将不执行赋值或执行语句,并且它将完成for-in语句的执行。
所以
for (index, value) in enumerate([1, 2, 3, 4, 5]) {
// ...
}是相同的
let enumGenerator = enumerate([1, 2, 3, 4, 5])
var genFunc = enumGenerator.generate()
while let (index, value) = genFunc.next() {
// ...
}let enumGenerator = enumerate([1, 2, 3, 4, 5])返回一个EnumerateGenerator<Seq.Generator> (在本例中是EnumerateGenerator<IndexingGenerator<Array<Int>>>)。这符合SequenceType协议。var genFunc = enumGenerator.generate()再次返回一个EnumerateGenerator<Seq.Generator> (可能是enumGenerator的副本)。这符合GeneratorType协议。genFunc.next()返回Element?,其中Element是(index: Int, element: Base.Element)的类型别名。
在本例中,next()返回(index: Int, element: Int)?。下一个函数返回可选的元组,直到数组用完为止,其中它返回nil。https://stackoverflow.com/questions/25611526
复制相似问题