Swift - Optionals

簡介

通過構(gòu)造函數(shù)為Int類型的變量count賦一個初始值
var count: Int = Int("42")
此時count的初始值就是42
var numb: Int = Int("hello")
此時通過構(gòu)造函數(shù)無法構(gòu)造出一個Int類型的數(shù)字厨疙,程序會報錯葡兑,number在這時是無值的粪滤。OC中程序會在這種情況下為number默認賦值為0弛随,這樣并不能嚴格區(qū)分出這個變量是否有值单旁。

  • Optional type
    Optional type是一個有兩個case的枚舉,Optional.none相當于nil蔫浆,Optional.some(Wrapped) 存儲著一個包裝過的值



    在swift中我們可以定義Optional類型的實例敞嗡,Optional實例的值的類型即為Optional type。這樣就可以嚴格區(qū)分出這個變量是否有值榛瓮,也可以初始化一個無值的實例切蟋。

使用

兩種使用Optional type的方法

let shortForm: Int? = Int("42") //在類型的后面加上?
let longForm: Optional<Int> = Int("42")

解包裝

optional類型實例存儲的內(nèi)容是被包裝起來的,我們需要解開包裝榆芦,才能讀取它的內(nèi)容柄粹。

  1. Optional Binding:如果要按條件將包裝值賦給新的實例,可以使用if let, guard let,或switch解包
var str: String?
if let strName = str {
    print("test" + strName)
} else {
    print("沒有值")
}
// Prints "沒有值"

這個過程相當于:1.判斷optional變量(常量)是否有值 2.如果有值匆绣,使用!取值

  1. Optional Chaining:如果要安全的訪問Optional類型實例的屬性或方法驻右,可以使用操作運算符(postfix)
let imagePaths = ["star": "/glyphs/star.png",
                  "portrait": "/images/content/portrait.jpg",
                  "spacer": "/images/shared/spacer.gif"]
if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
    print("The star image is in PNG format")
}
  1. Using the Nil-Coalescing Operator(設置默認值):使用?? 如果Optional實例為nil,則為其設置一個默認值
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"

??還可以同時為多個Optional實例設置默認值

let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
  1. Unconditional Unwrapping:當你確定某個Optional實例擁有一個確定的值時崎淳,可以使用!強制解開包裝讀取內(nèi)容堪夭。
let number2 = Int("42")!
print(number2)
// Prints "42"

當optional常量/變量沒有任何東西時,讀取到的即為nil,這是有一定風險的森爽。



這里也可以使用操作運算符(postfix)

let isPNG = imagePaths["star"]!.hasSuffix(".png")
print(isPNG)
// Prints "true"
  1. Implicitly Unwrapped Optioal(自動解包):定義Optional變量或常量時恨豁,在類型后加上!(不再是加?),則在使用時可以直接取值(不用再加!強制解開包裝讀取內(nèi)容)爬迟。如果我們可以確定一旦變量或者常量被創(chuàng)建并初始化后橘蜜,一直都會有值,那么就可以使用隱式拆包方式獲取值付呕。
var str2: String! = "str2"
//不需要使用!计福,直接解包
let str2Name :String = str2

如果嘗試訪問的自動解包可選值不包含值,會觸發(fā)運行時錯誤徽职。我們依然可以想使用正常的Optional一樣象颖,使用if或者while 判斷自動解包可選值是否包含值

var str2: String! = nil
//不需要使用!,直接解包
if (str2 != nil) {
    print(str2)
}

注意事項

  1. 在swift中非optional類型常量和變量是不能設置為nil的姆钉,這與OC用的nil不同说订。
  2. swift中的nil不同與OC中的nil,在OC中潮瓶,nil表示不存在的對象陶冷。在Swit中,nil不是指針筋讨,只是表示某種類型的值不存在埃叭,
  3. optional可以設置任何類型值為nil,不僅僅是對象類型悉罕。如果在代碼中不確定這個變量或者常量是否有值赤屋,那么就聲明為optional。

以上是自己在學習Optional過程中的記錄和總結(jié)壁袄,如有不足类早,還望指教。

參考:

  1. https://developer.apple.com/documentation/swift/optional
  2. Swift的問號與驚嘆號:可有可無的 Optional
  3. http://blog.csdn.net/woaifen3344/article/details/29364743
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗜逻,一起剝皮案震驚了整個濱河市涩僻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栈顷,老刑警劉巖逆日,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萄凤,居然都是意外死亡室抽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門靡努,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坪圾,“玉大人晓折,你說我怎么就攤上這事∈扌梗” “怎么了漓概?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長病梢。 經(jīng)常有香客問我,道長飘千,這世上最難降的妖魔是什么堂鲜? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任护奈,我火速辦了婚禮,結(jié)果婚禮上擅憔,老公的妹妹穿的比我還像新娘篡石。我一直安慰自己凰萨,他們只是感情好珊搀,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布眶拉。 她就那樣靜靜地躺著朝刊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孵奶。 梳的紋絲不亂的頭發(fā)上疲酌,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音了袁,去河邊找鬼朗恳。 笑死,一個胖子當著我的面吹牛早像,可吹牛的內(nèi)容都是我干的僻肖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼卢鹦,長吁一口氣:“原來是場噩夢啊……” “哼臀脏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冀自,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤揉稚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熬粗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀玖,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年驻呐,在試婚紗的時候發(fā)現(xiàn)自己被綠了灌诅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芳来。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猜拾,靈堂內(nèi)的尸體忽然破棺而出即舌,到底是詐尸還是另有隱情,我是刑警寧澤挎袜,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布顽聂,位于F島的核電站,受9級特大地震影響盯仪,放射性物質(zhì)發(fā)生泄漏紊搪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一全景、第九天 我趴在偏房一處隱蔽的房頂上張望耀石。 院中可真熱鬧,春花似錦蚪燕、人聲如沸娶牌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汹桦,卻和暖如春鲁驶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舞骆。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工钥弯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人督禽。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓脆霎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狈惫。 傳聞我的和親對象是個殘疾皇子睛蛛,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容