The as operator (as 操作符)
对于 swift 初学者来说,
as
操作符尝尝使人困惑.
as?
operator, 可失败转换操作符 as?
表示可失败的转换, 或者叫做可选转换(Optional conversion)
, 当转换失败, 则返回nil
. 常用于Any
或者AnyObject
向其它类型转换.
request { res, _ in
if let response = res as? SQISpecifiedClass {
// ...
}
}
as!
operator, 强制转换操作符 as!
表示强制转换(Forced conversion)
, 编译器遇到此操作符, 会忽略此处的安全检查, 在运行时, 如果转换失败, 则会立即CRASH
/runtime trap
. 常用于已知实际类型的情况下, 向下转换(downcasting, converting from a class to one of its subclasses)
.
class Animal {}
class Dog: Animal {}
let a: Animal = Dog()
a as! Dog // forced downcast is allowed
as
operator 确定转换操作符 as
表示确定的转换(Guaranteed conversion)
, 编译器能够直接确定转换必然成功的情况下, 可以使用此操作符. 常用于如下情况:
-
- 向上转换
(upcasting)
(子类转换为父类);
- 向上转换
-
- 指定文字表达式的类型, (e.g.,
1 as Float
);
- 指定文字表达式的类型, (e.g.,
-
- swift 对象转换为对应的 Objective-C 对象, (eg.,
Data() as NSData
)’
- swift 对象转换为对应的 Objective-C 对象, (eg.,
/**
* 1. 向上转换 upcasting
* `d`的类型最终为`Animal`
*/
class Animal {}
class Dog: Animal {}
let d = Dog()
d as Animal
/**
* 2. 指定文字表达式的类型
*/
let f = 2 as Float // 类型为`Float`, 值为2.0
let cf = 2 as CGFloat // 类型为`CGFloat`, 值为2.0
/**
* 3. swift 对象转换为对应的 Objective-C 对象
*/
let data = Data()
let nd = data as NSData
相关文档
苹果官方blog提供了非常有价值的描述: https://developer.apple.com/swift/blog/?id=23