Swift可选类型(Optional)之星耀

时间:2022-12-26 14:14:29
首先我们先看下Objective-C与Swift语言对于可选nil的不同理解:
Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound)
Swift中的nil:表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil)

一、申明可选常量或变量

let status: Int? = 1   // 申明可选Int类型的常量,初始值为1
var defaultAddress: String? = "上海徐汇" // 申明可选String类型的变量,初始值为"上海徐汇"
var str: String? // 申明可选String(自定义的类)的变量,初始值为nil

注意:Int?Int不相同,Int?表示可选的Int类型,可以赋值为nil,而Int不可以赋值为nil

二、使用"!"强制解析获取可选类型的值(不建议直接使用)
var defaultAddress: String? = "上海徐汇"
if defaultAddress != nil { // !=或==可以用来判断是否为nil
print("您的地址是\(defaultAddress!)") // 使用!强制解析
} else {
print(
"对不起,您不存在地址信息")
}
//您的地址是上海徐汇
var str: String?
print(
"str为\(str!)")
//Unexpectedly found nil while unwrapping an Optional value(XCode会提示运行错误,因为str初始值为nil,强制解析不行)
三、使用可选绑定获取可选类型的值(建议的用法)
var defaultAddress: String? = "上海徐汇"
if let address = defaultAddress { // 如果defaultAddress有值或类型转换成功,则将值赋值给address直接使用
print("您的地址是\(address)") // 使用address代替defaultAddress,且不需要加!强制解析
} else {
print(
"对不起,您不存在地址信息")
}
//您的地址是上海徐汇
四、隐式解析可选类型(用于申明时肯定有初始值,但后面可能为nil)
var mobileNumber: Int64! = 13812345678 // 第一次申明有初始值
print("您的电话号码是\(mobileNumber)") // 不需要使用!强制解析
// 您的电话号码是Optional(13812345678)
// 还是不建议直接强制解析,因为实际项目中可能中间已经对该值做了改变,若为nil则会运行错误导致APP崩溃
if let number = mobileNumber { // 建议的做法
print("您的电话号码是\(number)")
// 打印内容:**您的电话号码是****13812345678**
} else {
print(
"您没有记录电话号码")
}
//您的电话号码是13812345678
五、空合运算符(用于判断变量或常量是否为nil)

空合运算符(a ?? b)将对可选类型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b.这个运算符有两个条件:

  • 表达式a必须是Optional类型
  • 默认值b的类型必须要和a存储值的类型保持一致

空合运算符是对以下代码的简短表达方法

a != nil ? a! : b

上述代码使用了三目运算符。当可选类型a的值不为空时,进行强制解封(a!)访问a中值,反之当a中值为空时,返回默认值b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性

下文例子采用空合运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:

let defaultColorName = "red"
var userDefinedColorName: String
? //默认值为 nil
var colorNameToUse
= userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"