Swift 枚举生成器和元组

Swift 枚举生成器和元组,swift,enumerate,Swift,Enumerate,枚举函数返回枚举生成器的类型。但在Swift中,您可以使用它并将其分配给tuple。枚举生成器如何成为元组 Definition: func enumerate<Seq : SequenceType>(seq: Seq) -> EnumerateGenerator<Seq.Generator> for (index, value) in enumerate([1, 2, 3, 4, 5]) { // How does EnumerateGenerat

枚举函数返回枚举生成器的类型。但在Swift中,您可以使用它并将其分配给tuple。枚举生成器如何成为元组

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?
}
定义:func枚举(seq:seq)->枚举生成器
对于枚举([1,2,3,4,5])中的(索引,值){
//枚举生成器如何成为元组?
}
在EnumerateGenerator的定义中,元素被类型化为一个元组,我是否正确地假设调用enumerate()与调用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>
}
结构枚举生成器:GeneratorType,SequenceType{
typealias元素=(索引:Int,元素:Base.Element)
突变func next()->元素?
typealias生成器=枚举生成器
func generate()->枚举生成器
}
来自Swift文档:

for in语句允许一个代码块每次执行一次 集合(或任何类型)中符合SequenceType的项 协议

对集合表达式调用generate方法以获取 生成器类型的值,即符合 GeneratorType协议。程序通过调用 流上的下一个方法。如果返回的值不是None,则为 分配给项模式,程序执行语句, 然后在循环开始时继续执行。否则,, 程序不执行赋值或执行语句,以及 它完成了for in语句的执行

所以

与相同

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])
    返回
    枚举生成器
    (在此 案例a
    枚举生成器
    )。这符合法律规定
    SequenceType
    协议

  • var genFunc=enumGenerator.generate()
    再次返回
    枚举生成器
    (可能是
    枚举生成器
    的副本)。 这符合
    GeneratorType
    协议

  • genFunc.next()
    返回
    Element?
    其中
    Element
    (索引:Int,元素:Base.element)

    在本例中,
    next()
    返回
    (索引:Int,元素:Int)?
    。这是下一个函数 返回可选的元组,直到数组用尽为止,其中返回
    nil

let enumGenerator = enumerate([1, 2, 3, 4, 5])
var genFunc = enumGenerator.generate()
while let (index, value) = genFunc.next() {
    // ...
}