Swift 官博文章翻译 - as! 运算符

原文链接:The as! Operator

译者:Mudox

在 Swift 1.2 之前,as 运算符可以用来完成两种不同类型转换操作。取决要转换的表达式的类型,和要转化到的类型,as 运算符可以完成如下两种转化:

Swift 1.2 把这两中操作分割开来,变成了两个独立的运算符。总是能成功的转化还是使用 as 运算符,二强制转化则使用新的 as! 运算符(注意这里不是两个运算符叠加在一起,它就是一个运算符)。 ! 暗示此类型转化可能会失败。这样,你一眼扫过代码就能知道那个类型转化会引发程序奔溃。

如下示例展示了这个新的语言变更:

class Animal {}
class Dog: Animal {}

let a: Animal = Dog()
a as Dog                // now raises the error:  "'Animal is not convertible to 'Dog';
                        // ... did you mean to use 'as!' to force downcast?"

a as! Dog               // forced downcast is allowed

let d = Dog()
d as Animal             // upcast succeeds

注意区分作为表达式后缀运算符的 !? 以及转换运算符 as!as?

译者注,用于类型注释时(type annotation):

在声明可为空类型时:

class Animal {}

class Cat: Animal {}

class Dog: Animal {
  var name = "Spot"
}

let dog: Dog? = nil
dog?.name               // evaluates to nil
dog!.name               // triggers a runtime error

let animal: Animal = Cat()
animal as? Dog  // evaluates to nil
animal as! Dog  // triggers a runtime error

您可以简单记忆为:在 Swift 中 ! 暗示 可能会失败? 暗示 可能为空 nil