importで使われる as
Dart
のimport
で使われるas
は競合する名前を持つ2種類のメンバ(変数や関数)
の衝突を防ぐ時に利用されます。
test.dart
class Element {
final int value;
const Element(this.value);
}
test2.dart
class Element {
final String value;
const Element(this.value);
}
main.dart
// testとtest2の両方に型にしたいElementクラスが存在する場合
import 'package:test/test.dart';
import 'package:test2/test2.dart' as test2;
// test側のElementクラスを使用
Element element = Element();
// test2側のElementクラスを使用
// as を使わないとtest側のElementが読み込まれコンパイルエラーを起こします
test2.Element element2 = test2.Element();
アプリの初回起動時間を短縮させるなどライブラリが必要になるまで読み込みを遅延させるにはdeferred as
を利用します。
library.dart
void bar() {
final s = "start";
}
test.dart
import 'package:lib/library.dart' deffered as library;
void main() {
foo();
}
// Future内でloadLibraryメソッドを利用し読み込みます。
Future foo() async {
await library.loadLibrary();
library.bar();
型キャストで使われる as
上記とは異なり、変数の型をテストして別の型にキャスト(オブジェクトの型を変換)するのにも使われます。null
やキャストできない変数に使用すると怒られます。if
文でis
を使用しても結果は同じです。
car.dart
class Car {}
class Toyota extends Car {
void car() {
print("トヨタの自動車です");
}
}
void main () {
final toyota = Toyota();
final Car prius = Toyota();
final crown = Toyota() as Car;
toyota.car();// 呼ばれる
prius.car(); // エラー
(prius as Toyota).car(); // 呼ばれる
crown.car(); // エラー
if (crown is Toyota) {
crown.car(); // 呼ばれる
}
}