gpt4 book ai didi

swift - "as?"、 "as!"和 "as"之间有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 04:59:15 32 4
gpt4 key购买 nike

在升级到 Swift 1.2 之前,我可以编写以下行:

if let width = imageDetails["width"] as Int?

现在它迫使我写下这一行:

if let width = imageDetails["width"] as! Int?

我的问题是,如果我被迫像上面那样写,难道我不能只写下面的代码并且它会做同样的事情吗?它会在 imageDetails 的所有值中给我相同的结果吗?

if let width = imageDetails["width"] as Int

最佳答案

用于向上转型和向下转型的 as 关键字:

// Before Swift 1.2
var aView: UIView = someView()

var object = aView as NSObject // upcast

var specificView = aView as UITableView // downcast

upcast,从派生类到基类,可以在编译时检查,永远不会失败。

但是,向下转型可能会失败,因为您无法始终确定具体的类。如果你有一个 UIView,它可能是一个 UITableView 或者一个 UIButton。如果你的沮丧变成了正确的类型——太好了!但是,如果您碰巧指定了错误的类型,则会出现运行时错误并且应用程序会崩溃。

在 Swift 1.2 中,向下转型必须是可选的,或者是 as?或者用 as! 来“强制失败”。如果您确定类型,则可以使用 as 强制转换!类似于您将如何使用隐式展开的可选:

// After Swift 1.2
var aView: UIView = someView()

var tableView = aView as! UITableView

感叹号绝对清楚地表明您知道自己在做什么,如果您不小心混淆了类型,很可能会出现严重错误!

一如既往?使用可选绑定(bind)是最安全的方法:

// This isn't new to Swift 1.2, but is still the safest way
var aView: UIView = someView()

if let tableView = aView as? UITableView {
// do something with tableView
}

从一个网站得到这个:SOURCE

关于swift - "as?"、 "as!"和 "as"之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637974/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com