转自 :http://www.theswiftworld.com/2015/03/06/the-as-operator/
在 Swift 1.2 之前,as
*** 作符可以进行两种类型的转换,这取决于被转换的表达式和转换到的类型。
有保证的转换 从一个类型到另一个类型的转换是否成功可以用过 Swift 的编译器来验证,例如,向上转型(从一个类转换到它的父类)或指定字面表达式的类型(比如,1 as float
)。
强制转换 Swift 编译器不保证从一个类型强制转换到另一个类型的安全性,这有可能会引起运行时陷阱。例如,向下转型,从一个类型转换到它的子类。
Swift 1.2 将有保证的转换和强制转换的表达方式分成了两个独立的 *** 作符。有保证的转换仍然使用 as
*** 作符,但强制转换现在使用 as!
*** 作符。!
代表这个转换可能会失败。这样,你就比较容易找出哪些转换会导致程序崩溃。
下面的例子描述了这个改变:
class Animal {}class Dog: Animal {}let a: Animal = Dog()a as Dog // 现在会报这样的错误: "'Animal is not convertible to 'Dog'; // dID you mean to use 'as!' to force downcast?"a as! Dog // 强制的向下转型是允许的let d = Dog()d as Animal // 向上转型成功
注意关于
!
和 ?
后缀的对比,还有转换 *** 作符 as!
和 as?
的对比: class Animal {}class Cat: Animal {}class Dog: Animal { var name = "Spot"}let dog: Dog? = nildog?.name // 返回 nildog!.name // 触发运行时错误let animal: Animal = Cat()animal as? Dog // 返回 nilanimal as! Dog // 触发运行时错误
从这些 *** 作符可以很容易的记住这个模式: !
代表 “可能会崩溃”,?
代表 “可能会返回 nil”。
以上是内存溢出为你收集整理的关于 as! *** 作符全部内容,希望文章能够帮你解决关于 as! *** 作符所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)