3 回答
TA贡献1966条经验 获得超4个赞
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
TA贡献1829条经验 获得超6个赞
as
在Swift 1.2及更高版本中,as只能用于向上转换(或消除歧义)和模式匹配:
// 'as' for disambiguation
let width = 42 as CGFloat
let block = { x in x+1 } as Double -> Double
let something = 3 as Any? // optional wrapper can also be added with 'as'
// 'as' for pattern matching
switch item {
case let obj as MyObject:
// this code will be executed if item is of type MyObject
case let other as SomethingElse:
// this code will be executed if item is of type SomethingElse
...
}
as?
在有条件的类型转换操作符as?会尝试进行转换,但回报nil,如果它不能。因此,其结果是可选的。
let button = someView as? UIButton // button's type is 'UIButton?'
if let label = (superview as? MyView)?.titleLabel {
// ...
}
as!
该as!运算符用于强制类型转换。
as!仅当您确定向下转换将始终成功时,才使用类型转换运算符()的强制形式。如果尝试向下转换为错误的类类型,则此形式的运算符将触发运行时错误。
// 'as!' for forced conversion.
// NOT RECOMMENDED.
let buttons = subviews as! [UIButton] // will crash if not all subviews are UIButton
let label = subviews.first as! UILabel
TA贡献1853条经验 获得超9个赞
可以正确执行您想要的操作的正确习惯(在所有Swift版本中,至少到并包括1.2)是as?可选的强制转换。
if let width = imageDetails["width"] as? Int
可选的强制类型转换返回一个可选的(在这种情况下为Int?),并在运行时进行测试。您的原始代码可能将强制转换为可选类型。
- 3 回答
- 0 关注
- 861 浏览
添加回答
举报