可選(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"