欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
复制代码

 

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

警告

第一行代码成功执行,但第二行代码会有编译器⚠️,而且会造成崩溃,这是为什么呢?造成这种情况的原因就是 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? 不会。

相关标签: Swift 5.1