web-dev-qa-db-ja.com

Dartのtypedefとは何ですか?

説明を読み、関数型のエイリアスであることを理解しました。

しかし、それをどのように使用しますか?関数型でフィールドを宣言する理由いつ使用しますか?それはどのような問題を解決しますか?

1つまたは2つの実際のコード例が必要だと思います。

53
Gero

Dartでのtypedefの一般的な使用パターンは、コールバックインターフェイスの定義です。例えば:

typedef void LoggerOutputFunction(String msg);

class Logger {
  LoggerOutputFunction out;
  Logger() {
    out = print;
  }
  void log(String msg) {
    out(msg);
  }
}

void timestampLoggerOutputFunction(String msg) {
  String timeStamp = new Date.now().toString();
  print('${timeStamp}: $msg');
}

void main() {
  Logger l = new Logger();
  l.log('Hello World');
  l.out = timestampLoggerOutputFunction;
  l.log('Hello World');
}

上記のサンプルを実行すると、次の出力が生成されます。

こんにちは世界
2012-09-22 10:19:15.139:Hello World

Typedef行は、LoggerOutputFunctionがStringパラメーターを取り、voidを返すことを示しています。

timestampLoggerOutputFunctionはその定義に一致するため、outフィールドに割り当てることができます。

別の例が必要な場合はお知らせください。

65
Cutch

Dart 1.24は新しいtypedef構文を導入し、ジェネリック関数もサポートします。以前の構文は引き続きサポートされています。

typedef F = List<T> Function<T>(T);

詳細については、 https://github.com/Dart-lang/sdk/blob/master/docs/language/informal/generic-function-type-alias.md を参照してください

関数タイプもインラインで指定できます

void foo<T, S>(T Function(int, S) aFunction) {...}

参照 https://www.dartlang.org/guides/language/language-tour#typedefs

15

最新のtypedef構文によると、ほんの少し変更された答え、例は次のように更新できます。

typedef LoggerOutputFunction = void Function(String msg);

class Logger {
  LoggerOutputFunction out;
  Logger() {
    out = print;
  }
  void log(String msg) {
    out(msg);
  }
}

void timestampLoggerOutputFunction(String msg) {
  String timeStamp = new Date.now().toString();
  print('${timeStamp}: $msg');
}

void main() {
  Logger l = new Logger();
  l.log('Hello World');
  l.out = timestampLoggerOutputFunction;
  l.log('Hello World');
}
1
Ted Zhang
typedef LoggerOutputFunction = void Function(String msg);

これは以前のバージョンよりもはるかに明確に見えます

0