刚开始学习Swift,下载了他人写的项目,用xcode打开后都会提示错误。将代码中的一些as
修改为as!
就没问题了。在网上找了下原因,发现了这篇文章—— The as! Operator,翻译如下:
as! 操作符
在Swift 1.2以前,操作符as
根据表达式的类型可以用来执行两种不同的转换:
- Guaranteed conversion: Swift编译器保证一种类型的值转换为另外一种类型。例如,向上转换(从一种类型转换为其父类型)或者指定表达式的类型(
1 as Float
). - Forced conversion: Swift编译器不保证这种强制将一种类型转换为其他类型的安全性,其可能导致运行时问题。例如,向下转换(从一种类型转换为其子类型).
Swift 1.2 从概念上将Guaranteed conversion和Forced conversion分成两种不同的操作符。 Guaranteed conversion仍然用as
操作符,而Forced conversion则用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?
做类比:
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中这些操作符模式的最简单方法是:!
表示“这可能有问题”,而?
表示“这可能为空”。
来源:oschina
链接:https://my.oschina.net/u/191949/blog/510516