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