SwiftでC#でいうところのコレクションクラスを作ってfor...inでループを回す方法。
どうやればいいかマニュアルを見てもよく分からなかったので試行錯誤中です。
方法を知ってる方居ましたらコメント頂けると助かります:D
(失敗)何も考えないでやってみる
class Hoge {
// 略
}
var items = Hoge()
for item in items {
}
>error: type 'Hoge' does not conform to protocol 'Sequence'
どうやらSequence Protocolを使うとできるらしい?
(失敗)Sequence Protocolを使ってみる
class Hoge : Sequence {
func generate() -> Hoge {
return self
}
}
var item = Hoge()
for item in items {
}
・・・すごくエラーが出ます。
The Swift Programming LanguageのFor-In Statementを見た感じ、
Generator Protocolも必要そうです。
(成功?)Generator Protocolも使ってみる
とりあえずエラーはなくなりました。
下記を試してみると分かりますが、
For-In Statementの説明に書かれている通り
- (Sequence Protocolの)generate methodが1度だけ呼ばれる
- (Generator Protocolの)next methodがnilを返すまで繰り返し呼ばれる
と処理されるようです。
class Hoge : Sequence, Generator {
var count = 0
func next() -> Hoge? {
println("Hoge \(self.count)")
if self.count < 10 {
self.count++
return self
}
return nil
}
func generate() -> Hoge {
println("generate()")
self.count = 0
return self
}
}
var hoge = Hoge()
for a in hoge {
}
この方法で良いのか分かりませんが、
後はnext()とgenerate()の中身を書けば動くのでいいのかな・・・?
追記
その後、Generator Protocolの実装先をインナークラスにしてみたところ
それっぽくまとまりました。
まとめ
- コレクションクラスにしたいクラスに Sequence プロトコルを実装する。
- コレクションクラスのインナークラスに Generator プロトコルを実装する。
- for...inで回す
@JunSuzukiJapan@github さんが [Swift]自作クラスでfor...in で、
うまくまとめてくださいました。ありがとうございます!