Вы должны взглянуть на сообщение 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
).
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
Я надеюсь, что ответ на ваш вопрос.
Не могли бы вы опубликовать пример того, как использовать его в продлении '' MyClass''? –
Я обновил свой ответ. – ABakerSmith
Не могли бы вы посмотреть мое редактирование. Класс, который я хочу сделать возможным с расширением, - это JavaUtilArrayList se выше. Вы знаете, как это сделать? –