【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part35 Dartの特徴

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part35 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part34 Dartの特徴

今回はジェネレーターについて学習します。

Dartの特徴

ジェネレーター

反復動作を制御するための特別なルーチンです。
Dartでもyeildというキーワードを使用して実装することが多いのではないでしょうか。
Dartでは「同期ジェネレータ(Iterator型)」と「非同期ジェネレータ(Stream型)」が存在するそうです。

Iteratorの理解

このジェネレータはIterator型です。
Iteratorはなかなか説明が難しいですが「リストの現在位置を指し示すオブジェクト」と覚えておくとよいかもしれません。

通常リストの操作は自身で要素を指定しますが、Iteratorに「次の要素ちょうだい」と頼み続けるだけで次々に要素を持ってきてくれます。
DartではIterableを継承して自身のクラスでIteratorを実現できます。
何がすごいかというと、このクラスを継承したクラスはforループで使用することができるようになることなのです!
自分でリストのようなクラスを作れるということですね。

class MyStrings extends Iterable<String> {
  final List<String> strings;
  
  MyStrings(this.strings);
  
  // ★
  @override
  Iterator<String> get iterator {
    // 今回はListが持っているIteratorオブジェクトを返却しています。
    return strings.iterator;
  }
}

void main()  {
  final hoges = MyStrings(['aaa', 'bbb', 'ccc']);
  
  // 自分で作ったMyStringsクラスのオブジェクトが繰り返しで使用できる!
  // しかもmoveNext()はcurrentとか面倒事も必要ないです。
  for (final hoge in hoges) {
    print(hoge);
  }
  
  // mapも使えます。len_listは数値のリストです。
  var lenList = hoges.map((v) => v.length);
  for(final len in lenList) {
    print(len);
  }
  
  // iterator(★を使って)を取得して直接操作もできます。
  // 以下のサンプルはfor (final hoge in hoges) {・・・と同じ結果になります。
  var ite = hoges.iterator;
  while(ite.moveNext()) {
    var elm = ite.current;
    print(elm);
  }
}

最後に

Iteratorは概念を押さえておかないと使うことは少し難しい印象です。
「自分でforが使えるオリジナルクラスが作れる!」と覚えておけばよいかもしれないです。

今日はここまで!