可选(Optional)类型是Swift的显著特点之一,用于处理值缺失的情况,提高安全性。Optional表示 “这里有一个值,并且等于XXX” 或者 “这里没有值”。Swift定义“?”为命名类型Optional的缩写。
//Optional的定义
var optionalString: String? = "Hello, World!"
var optionalString: Optional<String> = "Hello, World!"
String 和 String? 不是一个类型,String?是String的可选类型,既可存放String,又可存放String?。
var age: Int = nil
//直接赋值为nil是报错的
Swift中nil严格区分于其他类,Nil是一个单独的类。Optional可以让我们在具体的类和nil之间进行选择,此为可选型名字的由来。
//Optional的使用
var Str:String? = "World"
print("Hello, " + str)
//由于errorCode可能为nil 所以此处报错
强制解包(forced unwrapping)
//利用符号“!”进行强制解包
var str: String? = "World!"
"Hello, " + str!
//强制解包需要确定可选类型包含值,否则会报错
if str != nil {
print("Hello " + str!)
}
else {
print("str 值为 nil")
}
自动解包
在声明Optional变量的时候,使用“!”替换“?”,这样可选型变量在使用时,就不需要再添加“!”来获取值,它会自动进行解析。示例如下:
var str: String! = "Hello, World!"
if str != nil {
print(str)
}
else {
print("str 值为 nil")
}
可选绑定(optional binding)
可选绑定先判断可选类型是否包含值,如果包含值,就把值赋给一个临时常量(if let)或变量(if var)。示例如下:
//if let 解包(if var 也可,通常使用if let)
var str: String? = "World"
if let unwrapedStr = str {
print("Hello, " + unwrapedStr)
}
else {
}
简便起见,可以使用相同的变量名,不会造成冲突。例如:
var str: String? = "World!"
if let str = str {
print("Hello, " + str)
}
else {
}
Optional Chaining
var str: String? = "Hello, World!"
var upperStr = str?.uppercased()
//此处 ? 是尝试解包,upperStr类型仍为String? ,即使str的值是nil也不会报错。
if let str = str?.uppercased(){
print(str)
}
Nil Coalesce
var str: String? = "Hello, World!"
let str2 : String
//此处没有赋初值,若中间有操作,则会报错
if let str = str {
str2 = str
}
else{
str = "nil"
}
//三目运算符写法
let str2 = str == nil ? "str值为nil" : str
//与上面的三目运算符逻辑等价 但要简洁
let str2 = str ?? "str值为nil"