86

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

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

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

4

6 に答える 6

106

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');
}

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

Hello World
2012-09-22 10:19:15.139:Hello World

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

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

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

于 2012-09-22T17:21:13.663 に答える
29

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も参照してください

于 2018-04-19T04:22:16.420 に答える
20
typedef LoggerOutputFunction = void Function(String msg);

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

于 2019-05-05T23:49:31.430 に答える
10

最新の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');
}
于 2019-04-26T02:00:41.213 に答える
3

TypedefDartでは、他のアプリケーション関数のユーザー定義関数(エイリアス)を作成するために使用されます。

Syntax: typedef function_name (parameters);

typedefを使用して、関数に変数を割り当てることもできます。

Syntax:typedef variable_name = function_name;

変数を割り当てた後、それを呼び出す必要がある場合は、次のようになります。

Syntax: variable_name(parameters);

例:

// Defining alias name
typedef MainFunction(int a, int b);

functionOne(int a, int b) {
  print("This is FunctionOne");
  print("$a and $b are lucky numbers !!");
}

functionTwo(int a, int b) {
  print("This is FunctionTwo");
  print("$a + $b is equal to ${a + b}.");
}

// Main Function
void main() {
  // use alias
  MainFunction number = functionOne;

  number(1, 2);

  number = functionTwo;
 // Calling number
  number(3, 4);
}

出力:

This is FunctionOne
1 and 2 are lucky numbers !!
This is FunctionTwo
3 + 4 is equal to 7
于 2020-09-15T16:14:29.153 に答える
2

typedefdartバージョン2.13以降、関数だけでなく、必要なすべてのオブジェクトで使用できるようになりました。

たとえば、このコードは完全に有効になりました。

typedef IntList = List<int>;
IntList il = [1, 2, 3];

詳細については、更新された情報を参照してください: https ://dart.dev/guides/language/language-tour#typedefs

于 2021-05-20T20:18:52.193 に答える