2015-05-06 1 views
3

У меня есть пользовательский класс:Сделать класс итерабельным с помощью for for Loop?

class MyArrayClass { 
... 
} 

Этот класс является реализация пользовательского списка.

Я хочу сделать следующее:

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

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

Edit: Класс Я хочу сделать итерацию это JavaUtilArrayList он использует этот класс IOSObjectArray.

Какой протокол должен быть подтвержден моим классом таким образом, чтобы он работал в цикле?

ответ

0

Вы можете сделать это гораздо быстрее, используя NSFastGenerator:

extension MyArrayClass: SequenceType { 
    public func generate() -> NSFastGenerator { 
    return NSFastGenerator(self) 
    } 
} 
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).

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 

Я надеюсь, что ответ на ваш вопрос.

+0

Не могли бы вы опубликовать пример того, как использовать его в продлении '' MyClass''? –

+0

Я обновил свой ответ. – ABakerSmith

+0

Не могли бы вы посмотреть мое редактирование. Класс, который я хочу сделать возможным с расширением, - это JavaUtilArrayList se выше. Вы знаете, как это сделать? –