Swift 中的 as,as?,as! 的区别
程序员文章站
2024-02-20 19:19:16
...
Swift 中的 as,as?,as! 的区别
在我的认知中,如果 as
能成功的话,说明 as?
和 as!
也一定会成功。在大多数情况下这是对的,但凡是总有例外。看到下面的代码,不知道你能不能看出问题。
print(4 as Double) // print 4.0
print(4 as! Double) // crash
复制代码
警告
第一行代码成功执行,但第二行代码会有编译器⚠️,而且会造成崩溃,这是为什么呢?造成这种情况的原因就是 as 和 as? 与 as! 的执行机制不同。as 是在编译期执行的,而 as? 和 as! 是在运行时执行的。
在编译时执行的 as
因为 as 是在编译期执行的,而在编译期, 4 还只是个字面量,并没有给它赋值为 Int 类型,所以它会转型成功。4 as Double
与下面的代码是等价的。
let x = 4 as Double
let x: Double = 4
复制代码
在运行时实行的 as? 与 as!
当程序已经在运行时,上述代码中的 4 已经赋值为 Int 类型,所以当你执行第二句代码时,肯定会 crash,因为 Int 强转为 Double是不允许的。
as? 和 as! 操作结果是等价的,唯一的不同就是如果转型失败,as! 会 crash,而as? 不会。
上一篇: 判断输入年份是否为闰年