关于 as! 操作符
2015-10-09 10:48
330 查看
转自 :http://www.theswiftworld.com/2015/03/06/the-as-operator/
在 Swift 1.2 之前,
有保证的转换 从一个类型到另一个类型的转换是否成功可以用过 Swift 的编译器来验证,例如,向上转型(从一个类转换到它的父类)或指定字面表达式的类型(比如,
强制转换 Swift 编译器不保证从一个类型强制转换到另一个类型的安全性,这有可能会引起运行时陷阱。例如,向下转型,从一个类型转换到它的子类。
Swift 1.2 将有保证的转换和强制转换的表达方式分成了两个独立的操作符。有保证的转换仍然使用
下面的例子描述了这个改变:
注意关于
从这些操作符可以很容易的记住这个模式:
在 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? = nil dog?.name // 返回 nil dog!.name // 触发运行时错误 let animal: Animal = Cat() animal as? Dog // 返回 nil animal as! Dog // 触发运行时错误
从这些操作符可以很容易的记住这个模式:
!代表 “可能会崩溃”,
?代表 “可能会返回 nil”。
相关文章推荐
- JavaScript一些细节
- openbox设置透明效果
- Oracle Study之--Oracle DG备份之归档日志管理
- 你是否还在为android开发环境的搭建而犯难?
- hibernate映射文件在服务器没有网络的情况下报错
- Jenkins系列之—02Jenkins安装与配置
- 移动应用—— 获盈利的方式
- C++ 单冒号: 和双冒号:: 的作用
- 第五次作业
- google统计ga.js本地化提高网站性能
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
- initWithFrame方法的理解
- hive rcfile存储格式
- LevelDB原理探究与代码分析
- Linux终端常用快捷键
- Java(4)--多线程
- android switch_dev
- tomcat中jar包类的加载顺序
- CloseHandle(),TerminateThread(),ExitThread()的区别
- servlet文件下载和jspsmartupload上传