swift學習筆記之Optional

swift

前言


很早之前我就學習了一次swift,不過都是零零碎碎的根盒,有些地方理解不夠透徹炎滞,再加上公司項目暫時沒有遷移到swift,所以能夠練手的項目不多钠导。因此森瘪,趁著最近手頭上的活不多,最近也沒有什么我感興趣的新技術(shù)逮栅,趕緊回去補下課窗宇。

還記得剛學swift的時候担映,optional這個概念一直都是云里霧里的,比如一會用String!官硝,一會用String?短蜕,如果換著用有的時候還會報錯朋魔。所以今天就跟著網(wǎng)上的資料,梳理下optional孙援。

什么是optional


optional 是 swift 新加入的類型扇雕,當然OC中就沒有這個概念镶奉,所以一開始從OC轉(zhuǎn)swift在這方面會感到怪怪的崭放。這里先說下我的理解:如果是用 類型+鸽凶?那么這個值可以為 nil 玻侥,如果是用 類型+! 那么這個值就不能為nil。(這里個人感覺swift是不是區(qū)分太細了蜜徽,不知道后面會不會去掉這概念)

可選型的定義:類型 + ?

比如 String?票摇、Int?矢门、Float? 等,這里需要注意的是 String? 和 String 是完全不同的兩個類型隔躲,前者是 String 類型的可選型物延,后者是 String 類型叛薯,注意區(qū)分。比方說在OC中我們可以很簡單得給一個NSString變量賦值為nil:

 NSString *str = @"hello world";
 str = nil;

如果切換成swift就會報錯:

賦值為Nil報錯

為什么要這樣呢组力,網(wǎng)上的解釋是:

因為 swift 在做類型判斷的時候無法判斷 str 到底是 String 類型的可選型還是其他類型的可選型燎字,因此會導致編譯錯誤阿宅。

這個理由家夺。。姑且認為是對的吧榨为。煌茴。也就是說蔓腐,String類型默認不能為nil,如果要為nil散罕,則應該改為String?類型傀蓉。

改為String?不報錯

optional的解包:可選型變量+!


可選型是不能夠被直接使用的葬燎,因為swift是類型安全的(也就是說等號左邊和右邊類型相等谱净,如果為nil就不能判斷是什么類型,也就會崩潰)冈钦。比如這樣:

解包舉例

解包有2種形式:

  • 1派继、強制解包
    所謂的強制解包意思就是我們確保這個變量不為nil捻艳,那么就在這個可選型變量后邊加個!,例子如上圖所示绅络。但是這樣做容易出現(xiàn)問題恩急,萬一要是這個變量值變成nil纪蜒,那么整個程序就會崩潰∷嬷椋可以像下面這樣調(diào)整:
強制解包
  • 2窗看、使用 if let(var) 解包
if let(var)解包

這種解包方式可以保證 name 是解包過的显沈,不會再是 nil 這種情況,其實邏輯是和上面做非空判斷一樣的涤浇。

可選鏈式調(diào)用(Optional Chaining)


這個概念還是很常用的魔慷「桥恚可選鏈式調(diào)用(Optional Chaining)是一種可以在當前值可能為 nil 的可選值上請求和調(diào)用屬性涮帘、方法及下標的方法。如果可選值有值隧熙,那么調(diào)用就會成功,如果可選值是 nil 音念,那么調(diào)用將返回 nil躏敢。多個調(diào)用可以連接在一起形成一個調(diào)用鏈件余,如果其中任何一個節(jié)點為 nil ,整個調(diào)用鏈都會失敗旬渠,即返回 nil 端壳。不多說损谦,直接上代碼:

可選鏈式調(diào)用例子

我們可以看見因為第一個print中,name 為 nil 所以整個per?.name?.uppercaseString 就返回為nil,uppercaseString并沒有被執(zhí)行赦役。我們提前將per變成nil:

可選鏈式調(diào)用例子2

可以看見 per?.name?.uppercaseString只執(zhí)行到per就不執(zhí)行了,連name都沒執(zhí)行术羔,全部都是nil级历。

隱式可選型:類型 + !


隱式可選性大概是這個樣子

var name: String! = "hello world"

這里可能有的童鞋會疑惑,已經(jīng)有了顯示的可選型玩讳,為什么還需要有隱式的可選型嚼贡。這里其實隱式的可選型也是有一定作用的粤策。比如你有一個變量,聲明為隱式的可選型(!)秩贰,它的作用就是柔吼,當你這個類沒有被初始化的時候他是沒有值的愈魏,但是當你這個類初始化以后蝌戒,你可以確保他是有值的北苟,所以這里聲明為隱式的可選型,而不是顯示的傻昙。

總結(jié)


說了那么多,感覺還是OC的語法更加簡便僻爽,nil不用分開判斷贾惦,但是swift更加嚴謹安全须板。畢竟現(xiàn)在swift還在高速發(fā)展中,以后是什么樣誰也摸不準绪颖,說不定把Optional這一套去掉也不是不可能吧柠横,畢竟連ARC那么復雜的操作都實現(xiàn)了课兄,不是么第喳?

我是翻滾的牛寶寶,歡迎大家評論交流~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悠抹,一起剝皮案震驚了整個濱河市楔敌,隨后出現(xiàn)的幾起案子驻谆,更是在濱河造成了極大的恐慌,老刑警劉巖勺卢,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黑忱,死亡現(xiàn)場離奇詭異甫煞,居然都是意外死亡,警方通過查閱死者的電腦和手機常潮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門喊式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弥雹,“玉大人垃帅,你說我怎么就攤上這事延届〖粑穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵方庭,是天一觀的道長厕吉。 經(jīng)常有香客問我,道長械念,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任龄减,我火速辦了婚禮项钮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘希停。我一直安慰自己烁巫,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布宠能。 她就那樣靜靜地躺著亚隙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪违崇。 梳的紋絲不亂的頭發(fā)上阿弃,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音羞延,去河邊找鬼渣淳。 笑死,一個胖子當著我的面吹牛伴箩,可吹牛的內(nèi)容都是我干的入愧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砂客!你這毒婦竟也來了泥张?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鞠值,失蹤者是張志新(化名)和其女友劉穎媚创,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彤恶,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡钞钙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了声离。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒炼。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖术徊,靈堂內(nèi)的尸體忽然破棺而出本刽,到底是詐尸還是另有隱情,我是刑警寧澤赠涮,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布子寓,位于F島的核電站,受9級特大地震影響笋除,放射性物質(zhì)發(fā)生泄漏斜友。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一垃它、第九天 我趴在偏房一處隱蔽的房頂上張望鲜屏。 院中可真熱鬧,春花似錦国拇、人聲如沸洛史。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虹菲。三九已至,卻和暖如春掉瞳,著一層夾襖步出監(jiān)牢的瞬間毕源,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工陕习, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霎褐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓该镣,卻偏偏與公主長得像冻璃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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