天天看點

Swift筆記:可選類型

C 和 Objective-C 中并沒有可選類型這個概念。最接近的是 Objective-C 中的一個特性,一個方法要不傳回一個對象要不傳回nil,nil表示“缺少一個合法的對象”。然而,這隻對對象起作用——對于結構體,基本的 C 類型或者枚舉類型不起作用。對于這些類型,Objective-C 方法一般會傳回一個特殊值(比如NSNotFound)來暗示值缺失。這種方法假設方法的調用者知道并記得對特殊值進行判斷。然而,Swift 的可選類型可以讓你暗示任意類型的值缺失,并不需要一個特殊值。

可選類型

可選類型(optionals)來處理值可能缺失的情況。可選類型表示:

有值,等于 x

或者

沒有值

Swift 的Int類型有一種構造器,作用是将一個String值轉換成一個Int值。然而,并不是所有的字元串都可以轉換成一個整數。字元串”123”可以被轉換成數字123,但是字元串”hello, world”不行。

下面的例子使用這種構造器來嘗試将一個String轉換成Int:

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推測為類型 "Int?", 或者類型 "optional Int"
           

因為該構造器可能會失敗,是以它傳回一個可選類型(optional)Int,而不是一個Int。一個可選的Int被寫作Int?而不是Int。問号暗示包含的值是可選類型,也就是說可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。隻能是Int或者什麼都沒有。)

nil

給可選變量指派為nil來表示它沒有值:

var serverResponseCode: Int? = 
// serverResponseCode 包含一個可選的 Int 值 404
serverResponseCode = nil
// serverResponseCode 現在不包含值
           

nil不能用于非可選的常量和變量。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型。

如果你聲明一個可選常量或者變量但是沒有指派,它們會自動被設定為nil:

var surveyAnswer: String?
// surveyAnswer 被自動設定為 nil
           

Swift 的nil和 Objective-C 中的nil并不一樣。在 Objective-C 中,nil是一個指向不存在對象的指針。在 Swift 中,nil不是指針——它是一個确定的值,用來表示值缺失。任何類型的可選狀态都可以被設定為nil,不隻是對象類型。