7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swiftでコレクションクラス

Last updated at Posted at 2014-06-06

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の説明に書かれている通り

  1. (Sequence Protocolの)generate methodが1度だけ呼ばれる
  2. (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の実装先をインナークラスにしてみたところ
それっぽくまとまりました。

まとめ

  1. コレクションクラスにしたいクラスに Sequence プロトコルを実装する。
  2. コレクションクラスのインナークラスに Generator プロトコルを実装する。
  3. for...inで回す

@JunSuzukiJapan@github さんが [Swift]自作クラスでfor...in で、
うまくまとめてくださいました。ありがとうございます!

7
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?