Swift 可選類型

Swift 中的可選類型,意味著變量可能是 nil

標(biāo)記

  • 使用 T? 或者 Optional<T> 來表示 T 這個(gè)類型是一個(gè)可選的
let d: String? = nil
let a: Optional<String> = "a"
  • ! 有兩個(gè)意義:
  1. 強(qiáng)制解包。當(dāng)確定該變量不為 nil 的時(shí)候,可以在變量后加上 ! 來獲取值 (當(dāng)該值為 nil 時(shí)會(huì)引發(fā) crash)
let a: Optional<String> = "a"
let d: String? = nil

print(a!)
print(d!)

輸出:

a
Fatal error: Unexpectedly found nil while unwrapping an Optional value
  1. 在聲明的時(shí)候使用代表 在后續(xù)調(diào)用的時(shí)候 會(huì)自動(dòng)加上 ! 來強(qiáng)制解包。

使用以下例子證明(因?yàn)樽詣?dòng)加了 ! 因此會(huì)引發(fā) crash):

var b: String! = nil

b.shuffled()

輸出:

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

注意,實(shí)際上,在變量后加上了 ! 之后,說明該變量是可選類型,隱式被加上了 ?,相當(dāng)于:var a: String! == var a: String?!

var b: String! = nil

print(type(of: b))

輸出:

Optional<String>

在聲明變量的時(shí)候加上 ! 的場(chǎng)景,一般是聲明類的屬性的時(shí)候,假如不在 init() 方法中賦值(比如在 viewDidLoad 的時(shí)候才賦值),需要讓屬性成為可選類型,而假如使用 let btn:UIButton?? 去修飾的話,每次訪問這個(gè)屬性都需要手動(dòng)加上 !,就不方便,因此需要 let btn:UIButton! 去定義

可選綁定(if let & guard let else)

由于使用了 let,因此在語句中要使用 let 聲明的變量

  • if let 中假如參數(shù)(們)不為 nil,會(huì)執(zhí)行語句
let m: String? = nil;
let n: String? = "hi"

if let tmp = m {
    print(tmp)
}

if let tmp = n {
    print(tmp)
}

輸出:

hi
  • guard let else 意味著守衛(wèi)變量,僅當(dāng) let 的變量為 nil 的時(shí)候才會(huì)調(diào)用 {} 中的語句,當(dāng)該語句被調(diào)用時(shí),理應(yīng)要跳出當(dāng)前函數(shù)或者拋出異常 不讓此函數(shù)或者 runloop 繼續(xù)執(zhí)行下去,因此,在 {}需要有 return 或者 throw
func tmpFunc() {
    
    guard let tmp = m else {
        
        print("m is nil")
        return
    }
    
    guard let tmp2 = n else {
        
        print("n is nil")
        return
    }

    // 當(dāng)函數(shù)執(zhí)行至此,tmp & tmp2 一定有值
    
}

另外, guard 中聲明的變量,作用域不僅在其 {}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容