前言
很早之前我就學習了一次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就會報錯:
為什么要這樣呢组力,網(wǎng)上的解釋是:
因為 swift 在做類型判斷的時候無法判斷 str 到底是 String 類型的可選型還是其他類型的可選型燎字,因此會導致編譯錯誤阿宅。
這個理由家夺。。姑且認為是對的吧榨为。煌茴。也就是說蔓腐,String類型默認不能為nil,如果要為nil散罕,則應該改為String?類型傀蓉。
optional的解包:可選型變量+!
可選型是不能夠被直接使用的葬燎,因為swift是類型安全的(也就是說等號左邊和右邊類型相等谱净,如果為nil就不能判斷是什么類型,也就會崩潰)冈钦。比如這樣:
解包有2種形式:
- 1派继、強制解包
所謂的強制解包意思就是我們確保這個變量不為nil捻艳,那么就在這個可選型變量后邊加個!,例子如上圖所示绅络。但是這樣做容易出現(xiàn)問題恩急,萬一要是這個變量值變成nil纪蜒,那么整個程序就會崩潰∷嬷椋可以像下面這樣調(diào)整:
- 2窗看、使用 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 端壳。不多說损谦,直接上代碼:
我們可以看見因為第一個print中,name 為 nil 所以整個per?.name?.uppercaseString 就返回為nil
,uppercaseString并沒有被執(zhí)行赦役。我們提前將per變成nil:
可以看見 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)了课兄,不是么第喳?
我是翻滾的牛寶寶,歡迎大家評論交流~