?:

代表这是个可选类型(optional)的。如下,如果num有就为Int类型的,如果没有值那么就是nil。

let num:Int?

当我对number进行显示赋值时那么number就是Int类型的,如果没有对number电视赋值,那么number就为nil类型

let number:Int? = 

!:

如果要操作一个optional类型的变量,需要先进行强解包,这就需要用到!了,如果有值就会得到变量的值,如果为nil那么程序就会crash

// 定义一个string的可选类型str,显式赋值
var str: String? = "Hello"
let message = "你好" + str!
print(message)
// 定义一个string的可选类型str,不进行显式赋值,就会出现crash
var str2:String?
let message2 = "你好" + str2!
print(message2)

在第二段中就会报如下错误:

Fatal error: Unexpectedly found nil while unwrapping an Optional value

as

有保证的转换,从派生类转换为基类的向上转型(upcasts)

使用场合1:从派生类转换为基类,向上转型

class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal

使用场合2:数值类型转换----消除二义性

let num1 =  as CGFloat
let num2 = as Int
let num4 = ( / ) as Double

使用场合3:switch 语句中进行模式匹配

//如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。
switch animal {
case let cat as Cat:
print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
print("如果是Dog类型对象,则做相应处理")
default: break
}

as!

强制类型转换,向下转型(Downcasting)时使用,如果转换失败会报 runtime 运行错误。

官方解释说这是一个不被保证的转换,可能会因为强转的失败而会导致崩溃。同时 !是一个陷阱的标志,就像⚠️一样,用起来存在一定危险性。

class Animal {}
class Cat: Animal {}
let animal :Animal = Cat()
let cat = animal as! Cat

as?

[as?] 和 [as!] 操作符的转换规则完全一样。但 [as?] 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional)。由于 [as?] 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 [as!] ,否则使用 [as?] 。

let animal:Animal = Cat()
if let cat = animal as? Cat{
print("cat is not nil")
} else {
print("cat is nil")
}

参考链接:

swift里 as、as!、as?区别

最新文章

  1. [Chapter 3 Process]Practice 3.12 Including the initial parent process, how many processes are created by the program shown in Figure 3.32?
  2. phpmyadmin后台拿shell方法总结
  3. iOS7上TableViewCell的button和UIImageView个别未显示的bug
  4. Oracle数据库作业-6 查询“张旭“教师任课的学生成绩。
  5. View绘制详解(二),从setContentView谈起
  6. 【转】android的startActivityForResult学习心得
  7. Extjs4中用combox做下拉带图片的下拉框
  8. Python自动化运维之2、运算符与数据类型
  9. sql语句优化之not in
  10. MellPlayer, 基于网易云歌单的命令行播放器
  11. JavaBean入门笔记
  12. XCode v9.6.2017.0830
  13. jQuery中获取文档的高度、可视区域高度以及滚动条距页面顶部的高度
  14. [NOI 2011]阿狸的打字机
  15. MYSQL复制原理及其流程
  16. Cocos坐标之convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR区别和用法
  17. SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
  18. 文件编码检测.ZC一些资料(包含java的)
  19. kms可用激活服务器地址|kms可用激活服务器分享
  20. zookeeper+kafka集群的安装部署

热门文章

  1. 从git上拉下来的严选weex项目demo
  2. WPF的本质:数据和行为
  3. ios -本地存储和查看json数据
  4. Laravel5.1 路由 -基础
  5. C2 CompilerThread0 如果抓到的java线程dump里占用CPU最高的线程是这个,99%可能是因为服务重启了
  6. C#实现按键精灵的'找图' '找色' '找字'的功能
  7. 锁(java, DB)
  8. 数据类型比较:Long和BigDecimal
  9. Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常
  10. MySQL事件的先后