Swift 中的 as,as?,as! 的区别

5,205 阅读1分钟

在我的认知中,如果 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? 不会。