swift 可選類型(optional)

可選類型定義

Swift 標準庫中定義后綴 ??為可選類型 Optional<Wrapped> 的語法糖,這里語法糖可以簡單理解為一種便捷的書寫語法。也就是說,下面兩個聲明是等價的:

var name: Optional<String>

var name: String?

上述兩種情況,變量 name 被聲明為可選字符串類型。

我們可以在xcode編譯器中,按住 command 鍵 同時點擊 OPtional,可以跟進去查看可選類型的具體實現:

public enum Optional: ExpressibleByNilLiteral {

? ? ? ? ? ? /// The absence of a value.

? ? ? ? ? ? /// In code, the absence of a value is typically written using the `nil`

? ? ? ? ? ? /// literal rather than the explicit `.none` enumeration case.

? ? ? ? ? ? case none

? ? ? ? ? ? /// The presence of a value, stored as `Wrapped`.

? ? ? ? ? ? case some(Wrapped)

? ? ? ? ? ? /// Creates an instance that stores the given value.

? ? ? ? ? ? public init(_ some: Wrapped)

? ? ? ? ? ? 其他部分省略。。。。

}

我們看到,可選類型 Optional<Wrapped> 是一個枚舉,有兩個成員:none 和 some(Wrapped),表示可能沒有值或者可能有值。

var name: String?

print(name)

//打印:nil

name = "haha"

print(name)

//打印:Optional("haha")

上述例子,name聲明為可選類型,沒有初始化的時候,自動置為nil。當你聲明一個可選變量或常量但沒有賦初值,它們都會被自動置為nil。

注意:Swift 的 nil 和 Objective-C 中的 nil 并不一樣。在 Objective-C 中,nil 是一個指向不存在對象的指針。在 Swift 中,nil 不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態都可以被設置為 nil,不只是對象類型,但非可選的類型值不能置為nil

if 語句以及強制解析

可以使用 if 語句 和 nil 比較來判斷一個可選值是否有值:

if name != nil {

print(name!)

}

//打印:"haha"

當確定可選值有值的時候,可以在變量名后跟 !符號來強制解析該可選值,注意,不能用 !強制解析不包含值的可選值,否則導致運行出錯。

可選綁定

使用可選綁定來判斷一個可選值是否包含值,若包含值則賦給一個臨時變量或常量。如下可選綁定用在 if ?語句中:

if let nick = name {

print(nick)

}

//打印:"haha"

這段代碼可以理解為:可選值 name 包含一個值“haha”,則創建一個臨時的新常量 nick 并把可選值 name 的值賦給它。

?還可以包含多個可選綁定或多個布爾條件在一個 if 語句中,只要使用逗號分開就行。只要有任意一個可選綁定的值為nil,或者任意一個布爾條件為false,則整個if條件判斷為false。

隱式解析可選類型

有時候在程序中,第一次賦值后,可以確定一個可選類型總是有值,這樣,在以后的調用中總是判斷和解析可選值是效率低下的,這種類型的可選狀態為被定義為隱式解析可選類型。把想要用作可選類型的 ?改為 !來聲明一個隱式解析可選類型。隱式解析可選類型依然是一個可選類型,可選類型的特性它同樣適用,只是注意,當隱式解析可選項值為 nil 的時候解析取值,會運行出錯。如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型。

var hehe: String! = "hehe"

var s1: String = hehe? //s1類型是 String

var s2 = hehe? ? ? ? //s2類型是由 hehe 推斷出為 可選類型 String?,所以下面打印格式不同

print(hehe,s1,s2)

//打印:hehe hehe Optional("hehe")

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容