Swift에서는 as?
로 안전하게 type casting을 할 수 있었다.
class A {}
class B: A {}
class C {}
let a = A()
let b = B()
b as? C // nil
Dart는 as
keyword로 type casting을 할 수 있지만, incompatible type으로 casting을 시도하면 type error가 발생한다.
Error 없이 type casting을 하려면 type check를 먼저 해야 한다.
class A {}
class B extends A {}
class C {}
final a = A();
final b = B();
a as C // type error
if (a is B) {
a as B // OK
}
매번 type check를 해서 casting하기 번거로우므로, 아래와 같은 extension을 만들어서 사용할 수 있다.
extension SafeTypeCast on Object? {
T? asOrNull<T>() {
var self = this;
return self is T ? self : null;
}
}
a.asOrNull<B>(); // OK
참고
- https://github.com/dart-lang/language/issues/399
- https://www.dhiwise.com/post/the-ultimate-guide-to-dart-type-cast-converting-data-types