変数の型を柔軟に扱いたいときにdynamic型を利用します。
Dart言語は、基本的に明確な型を持ち数値や文字列など、変数がどのようなデータを持つか明示的に示す必要があります。しかし、dynamic型を使用すると、一つの変数がさまざまな型のデータを持つことができます。
利用場面
- 事前に変数の型がわからない場合。
- さまざまな型のデータを同一の変数で取り扱いたいとき。
- APIや外部ライブラリから返される未知のデータ型を扱うとき。
ここでは、オブジェクトの型を返すruntimeType
を利用して実行時の型を表示します。
dynamic item = 30;
print(item.runtimeType); // int
item = "Dart";
print(item.runtimeType); // String
item = [1, 2, 3];
print(item.runtimeType); // List<int>
- 1つ目は、
item
変数に数値を代入して、int型であることを確認します。 - 2つ目では、同じ
item
変数に文字列を代入するとitem
は、String型に変わります。 - 3つ目では、同じ
item
変数にリストを代入するとitem
は、List型に変わりました。
これにより変数の型が動的に変わったことが確認できます。
daynamicとvarは、変数の代入時にint、Stringなど型を決めておく必要はない点で似ていますが、いくつかの違いがあります。
特徴 | var | dynamic |
---|---|---|
型推論 | する | しない |
型変更 | 不可 | 可能 |
安全性 | 高い | 中 |
柔軟性 | 低い | 高い |
- 型推論
var
は初期値の型に基づき変数の型が自動的に決定されます。一方、dynamic
は型の自動推定を行いません。 - 型変更
var
を使用すると、初期値の型に固定され、後から型を変更することはできません。dynamic
はいつでも型を変更できます。初めは数値を持ち、次に文字列を持つこともできます。 - 安全性
var
は型の間違いを早期に検出するため、コードの安全性が向上します。dynamic
はエラーが実行時まで見えない場合があります。 - 柔軟性
var
は初期値の型に変数が固定されるため柔軟性は低めです。dynamic
は任意の時点で任意の型を持つことができるので、柔軟性が高いです。
var
は型の安全性を確保したい場合や、変数の型が変わることがない場面で使用します。dynamic
は型が頻繁に変わる可能性がある場面や、型が不明なデータを扱う場面で利用できますが、過度な利用は不具合が発生時の原因になりかねません。