前言、Objective-C与Swift语言对于可选nil的不同理解:
- Objective-C中的nil: 表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound)。
- Swift中的nil: 表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil)。
一、可选项的创建
1、声明可选String类型的变量,初始值为nil
var str2: String? = nil
2、声明可选String类型的变量,初始值为"你好呀"
var str3: String? = "你好呀"
var str: String = nil //此时代码报错
注意
非可选型不可以设置为nil,否则会报错
二、解包可选项的值
1、使用使用if进行展开,获取可选项的值
//声明可选String类型的变量,初始值为"你好呀"
var str3: String? = "你好呀"
//需要使用if进行展开
if str3 != nil {
let count = str3!.count //使用"!"解包 str3 的值
print(count)
}
2、使用可选绑定获取可选类型的值(建议使用)
if let tempStr = str3 { //如果str3有值获取类型转换成功,则将值赋值给tempStr直接使用
print("tempStr is \(tempStr)") //使用tempStr代替str3,切不需要加!强制解析
} else {
print("str3 is nil")
}
3、隐式解析可选类型,使用!(用于申明是肯定有初始值,但后面可能为nil)
var mobileNumber: Int64! = 187734098765 //第一次申明有初始值
var mobileNumber2: Int64! = nil //这样也不会报错
print("您的电话号码是:\(String(describing: mobileNumber))") //打印内容是:您的电话号码是:Optional(187734098765)
//还是不建议直接强制解析,因为实际项目中可能中间已经对该值做了改变,若为nil则会运行错误导致APP崩溃
建议的做法:还是使用可选绑定获取可选类型的值
if let number = mobileNumber {
print("你的电话号码是:\(number)") //此时打印:你的电话号码是:187734098765
} else {
print("你的电话号码为空号")
}
4、可选项链,在可选项后面加?还是可选项,如果可选项不为nil,则返回一个可选项结果,否则返回nil
var str4: String? = "abc"
let count2 = str4?.count //在可选项的后面加?
if count2 != nil { //使用 if 展开
print("count2 is \(count2! - 1)") //使用!展开count2的数据
}
5、optional的底层就是一个public的枚举,而且是泛型的类型。他有两个属性,一个是none,也就是nil;一个是some,代表可选类型的值
//可以将之前的 ? 改成 optional,效果是一样的
//声明可选 String 类型的变量,初始值为"abc"
var str5: Optional<String> = "abc"
if let str6 = str5 { //使用可选绑定获取可选类型的值
print("str6 is \(str6)")
}
6、因为他是一个泛型(unsafelyUnwrapped),所以展开也可以使用 unsafelyUnwrapped 去替代 ! ,效果也是一样的
var str7: String? = "abc"
if str7 != nil {
print("str7 is \(str7.unsafelyUnwrapped)")
}