Swift踩坑——可空类型

本文详细探讨了Swift中的可空类型,包括可空类型的定义、可空实例绑定、可空链式调用和nil合并运算符的使用。通过实例解析了可空类型在实际编程中的应用和注意事项,强调了安全编程的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文原载于我的博客:https://www.seekingmini.top/archives/swift踩坑可空类型

写在前面

Swift是一门非常安全的语言…

可空类型

什么是可空类型

可空类型􏲜􏲤(optional)是Swift的独特特性,用来􏰏定某个实例可能没有值。如果一个实例没有值,就称其为nil

举例
var n1: Int?
print(n1)
var n2: Int
print(n2)

以上代码两者打印的结果不同,n1的打印结果为nil,而n2的打印结果为0。在声明变量n1时在后面加了一个?表示其成为可空类型变量。我们希望􏽉􏴌知道的是变量何􏾷时为nil,以􏱻相应地执行一些代码。在这种情况下,可以使用条件语句来􏻕对变量的值做到这一点。

var n1: Int?
n1 = 1
print(n1)
if n1 != nil {
    let n2 = n1!
    print(n2)
}

n1的打印结果为Optional(1)n2的打印结果为1。两者打印的结果不同是因为在声明n2n1后面加了一个!表示强制展开(forced unwrapping)。强制展开会强制访问可空实例封装的值,也就是说,如果n1为空,使用强制展开就会产生运行时错误。

特别说明:􏵚强制展开􏾮有一定的危险性。如果可空实例没有值,程序会在运行时􏳪触发陷阱􏳫􏳬。

可空实例绑定

如果有值,就将其赋给一个􏲓临时常量或变量,并且使这个常量或变量在条件语句的第一个分支代码中可用。

语法格式
if let tmp = optional {
		// 使用tmp做一个事情
} else {
  	// optional为nil
}
举例
var n1: Int?
if let n2 = n1 {
    print(n2)
} else {
    print("空")
}

以上代码打印结果为,因为n1是可空实例且为空,所以不会调用if分支的代码而是调用else分支的代码。这样有一个好处就是不需要强制展开可空实例,减少陷阱的触发。

可空链式调用

可空链式调用允􏿠许我们把多个查询􏴋串联􏱋为一个可空􏰲实例的值。如果链式调用中的􏰅每个可􏰲空实例都包含􏳝值,那么每个调用都会成功􏿫,整个查询􏴋􏲲会返回期望类型的可空􏰲实例。如果查询链􏴋􏲲中的任意可􏰲空实例是nil,那么整个􏲲式调用会􏿸返回nil

举例
var n1: Int?
n1 = 200
var description: String?
if let n2 = n1, n2 == 200 {
    description = "Success."
}
print(description?.uppercased())

以上代码打印结果为Optional("SUCCESS.")if分支首先会判断n1是否为空,再判断n2的值是否为200

nil合并运算符

处理可空􏰲类型时的一个常见􏲘动作时是:要么􏱃获取其值(如果可􏰲实例有值),要么使用某个􏱧默认值(如果可􏰲实例是nil)。可以用nil合并运算符(nil coalescing operator)??来􏰯到这个目的。

举例
var n1: Int?
n1 = 666
let n2: Int = n1 ?? 0
print(n2)

以上代码打印结果为666

总结

可空类型最好用来表示本来就可以为空的概念,即适合用来表示缺失某些东西的场景。但是缺失不等于零。例如:一个人养了一只宠物狗,其名字就可以为空(只是举个例子而已…);而一个人的银行账户余如果为空就需要用零来表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值