一尘不染

“ as”,“ as!”和“ as”有什么区别?

swift

在升级到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

阅读 570

收藏
2020-07-07

共1个答案

一尘不染

as关键字用于进行上下转换:

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

var object = aView as NSObject // upcast

var specificView = aView as UITableView // downcast

从派生类到基类的转换可以在编译时检查,并且永远不会失败。

但是,向下转换可能会失败,因为您无法始终确定特定的类别。如果您有UIView,则可能是UITableView或UIButton。如果您的垂头丧气选择正确的类型,那就太好了!但是,如果碰巧指定了错误的类型,则会出现运行时错误,并且应用程序将崩溃。

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

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

var tableView = aView as! UITableView

感叹号清楚地表明您知道自己在做什么,并且如果您不小心混淆了各种类型,很可能事情会变得非常错误!

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

// 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

2020-07-07