Swift 可選(Optionals)型別

Swift 的可選(Optional)型別,用於處理值缺失的情況。可選表示"那兒有一個值,並且它等於 x "或者"那兒沒有值"。

Swfit語言定義字尾?作為命名型別Optional的簡寫,換句話說,以下兩種宣告是相等的:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

在這兩種情況下,變數 optionalInteger 都是可選整數型別。注意,在型別和 ?之間沒有空格。

Optional 是一個含有兩種情況的列舉,None 和 Some(T),用來表示可能有或可能沒有值。任何型別都可以明確宣告為(或者隱式轉換)可選型別。當宣告一個可選型別的時候,要確保用括號給 ? 操作符一個合適的範圍。例如,宣告可選整數陣列,應該寫成 (Int[])? 寫成 Int[]? 會報錯。

當你宣告一個可選變數或者可選屬性的時候沒有提供初始值,它的值會預設為 nil。

可選項遵照 LogicValue 協議,因此可以出現在布林環境中。在這種情況下,如果可選型別T?包含型別為T的任何值(也就是說它的值是 Optional.Some(T) ),這個可選型別等於 true,反之為 false。

如果一個可選型別的例項包含一個值,你可以用字尾操作符 !來訪問這個值,如下所示:

optionalInteger = 42
optionalInteger! // 42

使用操作符!去獲取值為nil的可選變數會有執行時錯誤。

你可以用可選連結和可選繫結選擇性執行可選表示式上的操作。如果值為nil,任何操作都不會執行,也不會有執行報錯。

讓我們來詳細看下以下例項來了解 Swift 中可選型別的應用:

import Cocoa

var myString:String? = nil

if myString != nil {
    print(myString)
}else{
    print("字串為 nil")
}

以上程式執行結果為:

字串為 nil

可選型別類似於Objective-C中指標的nil值,但是nil只對類(class)有用,而可選型別對所有的型別都可用,並且更安全。


強制解析

當你確定可選型別確實包含值之後,你可以在可選的名字後面加一個感嘆號(!)來獲取值。這個感嘆號表示"我知道這個可選有值,請使用它。"這被稱為可選值的強制解析(forced unwrapping)。

例項如下:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值為 nil")
}

以上程式執行結果為:

Optional("Hello, Swift!")

強制解析可選值,使用感嘆號(!):

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   // 強制解析
   print( myString! )
}else{
   print("myString 值為 nil")
}

以上程式執行結果為:

Hello, Swift!

注意:
使用!來獲取一個不存在的可選值會導致執行時錯誤。使用!來強制解析值之前,一定要確定可選包含一個非nil的值。


自動解析

你可以在宣告可選變數時使用感嘆號(!)替換問號(?)。這樣可選變數在使用時就不需要再加一個感嘆號(!)來獲取值,它會自動解析。

例項如下:

import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值為 nil")
}

以上程式執行結果為:

Hello, Swift!

可選繫結

使用可選繫結(optional binding)來判斷可選型別是否包含值,如果包含就把值賦給一個臨時常量或者變數。可選繫結可以用在if和while語句中來對可選型別的值進行判斷並把值賦給一個常量或者變數。

像下面這樣在if語句中寫一個可選繫結:

if let constantName = someOptional {
    statements
}

讓我們來看下一個簡單的可選繫結例項:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {
   print("你的字串值為 - \(yourString)")
}else{
   print("你的字串沒有值")
}

以上程式執行結果為:

你的字串值為 - Hello, Swift!