我有一个自定义类:
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循环中工作?
答案 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)
}
}