使用for in循环使类可迭代?

时间:2015-05-06 15:21:13

标签: ios swift

我有一个自定义类:

class MyArrayClass {
...
}

此类是自定义列表实现。

我想做以下事情:

var arr:MyArrayClass = MyArrayClass()
arr.append("first")
arr.append("second")
arr.append("third")

for entry in arr {
  println("entry: \(entry)")
}

编辑:我想要进行迭代的课程是JavaUtilArrayList,它使用此课程IOSObjectArray

哪个协议必须由我的班级确认,以便在for循环中工作?

2 个答案:

答案 0 :(得分:4)

您应该查看有关此确切主题的this博文。我虽然在这里写了一个摘要:

当你写:

// mySequence is a type that conforms to the SequenceType protocol.
for x in mySequence {
    // iterations here
}

Swift将其转换为:

var __g: Generator = mySequence.generate()
while let x = __g.next() {
    // iterations here
}

因此,为了能够枚举您的自定义类型,您还需要使您的类实现SequenceType协议。查看下面的SequenceType协议,您可以看到只需要实现一个方法,该方法返回符合GeneratorType协议的对象(博客文章中包含GeneratorType)。< / p>

protocol SequenceType : _Sequence_Type {
    typealias Generator : GeneratorType
    func generate() -> Generator
}

以下是如何在MyArrayClass循环中使for可用的示例:

class MyArrayClass {
    var array: [String] = []

    func append(str: String) {
        array.append(str)
    }
}

extension MyArrayClass : SequenceType {
    // IndexingGenerator conforms to the GeneratorType protocol.
    func generate() -> IndexingGenerator<Array<String>> {
        // Because Array already conforms to SequenceType,
        // you can just return the Generator created by your array.
        return array.generate()
    }
}

现在在实践中使用它:

let arr = MyArrayClass()
arr.append("first")
arr.append("second")
arr.append("third")

for x in arr {
    println(x)
}

// Prints:
//     First
//     Second
//     Third

我希望能回答你的问题。

答案 1 :(得分:0)

使用NSFastGenerator

可以更快地完成任务
extension MyArrayClass: SequenceType {
  public func generate() -> NSFastGenerator {
    return NSFastGenerator(self)
  }
}