swift 中 as as! as? 区别

1、as

仅当一个值的类型在运行时(runtime)和as模式右边的指定类型一致、或者是该类型的子类 的情况下,才会匹配这个值。如果匹配成功,被匹配的值的类型被转换成as模式左边指定的模式。

as 应用条件有2种情况:
(1)、和“as”右边类型一致
(2)、是右边类型的子类

        class ball {}
        class football:ball {}
        
        let a = ball()
        a as ball //a和右面的ball类型一致,编译成功
        
        let f = football()
        f as ball // d 是右面ball的子类,编译成功

2、as!

如果碰到as左边类型是右边类型的父类,则会报错!as不可以用来父类转子类,这个时候可以用强转 as!

        class ball {}
        class football:ball {}
        
        let a = ball()
        a as ball // 编译成功
        
        let f = football()
        a as football // 编译报错

编译器会提醒你用as!

3、as?

as?相当于optional类型,如果强转失败的话会返回nil。

        class ball {}
        class football:ball {}
        class basketball:ball {}
        
        let aball:ball = basketball()
        aball as? football // 取到的是nil
        aball as! football //运行时报错

参考文章:http://blog.csdn.net/h454036111/article/details/49151933

你可能感兴趣的:(swift 中 as as! as? 区别)