? 和 ! 和 as 和 as? 和 as!

本文介绍了Swift中optional类型的基本概念,包括强解包与潜在丢失的陷阱,向上转型和向下转型的技巧,以及as关键字在转换过程中的应用。重点讲解如何避免nil引用错误和合理使用类型转换以提升代码健壮性。
摘要由CSDN通过智能技术生成
  • ?

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

let num:Int?

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

let number:Int? = 2
  • !

如果要操作一个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). 使用场合1:从派生类转换为基类,向上转型

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

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

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

(3). 使用场合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")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值