• 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가 발생한다. Dart에는 optional casting 연산자가 따로 없으므로, 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 C) {
      a as C // Never executed
    }
    
    if (a is B) {
      a as B // ✅ OK
    }
    
  • 매번 type check를 하려면 번거로우므로, 아래와 같은 extension을 만들어서 사용하면 편리하다.

    extension SafeTypeCast on Object? {
      T? asOrNull<T>() {
        var self = this;
        return self is T ? self : null;
      }
    }
    
    a.asOrNull<B>();// OK
    

참고