Swift基礎(chǔ)之05-可選類(lèi)型

import UIKit

可選類(lèi)型基礎(chǔ)知識(shí)

在swift中nil也是一種數(shù)據(jù)類(lèi)型待牵,只有可選類(lèi)型可以賦值為nil烘苹,其他類(lèi)型都必須進(jìn)行對(duì)應(yīng)類(lèi)型賦值显拳。
所以對(duì)于一些需要進(jìn)行賦值nil的類(lèi)型可以先定義為可選類(lèi)型窿克,然后賦值后調(diào)用的時(shí)候再進(jìn)行可選類(lèi)型的解包調(diào)用

1,可選類(lèi)型定義
  • 方式一棕硫,不常用
let name:Optional<String> = nil
  • 方式二:語(yǔ)法糖髓涯,其實(shí)是方式一的包裝
var name01:String? = nil
2袒啼,可選類(lèi)型賦值
name01 = optional("z")
name01 = "zhangdanfeng"http://會(huì)自動(dòng)包裝optional
name01 = "jack"
3哈扮,可選類(lèi)型取值
print(name01)//打印結(jié)果是:Optional("jack")
  • 需要強(qiáng)制解包(強(qiáng)制解包比較危險(xiǎn)纬纪,如果內(nèi)部沒(méi)有賦值為nil,會(huì)直接崩潰)
print(name01!)//打印結(jié)果是:jack
  • 所以標(biāo)準(zhǔn)的解包過(guò)程應(yīng)該先判斷一下是否有值(但是這個(gè)比較麻煩滑肉,所以請(qǐng)看可選綁定)
if name01 != nil {
    print(name01!)
    print(name01!)
    print(name01!)
    print(name01!)
}
4包各,可選綁定(可選類(lèi)型每次使用的時(shí)候都需要判斷是有值,然后強(qiáng)制解包靶庙,為了避免這種重復(fù)操作问畅,可以使用可選綁定,如下)
//先判斷name01是否有值六荒,如果有值护姆,解包然后賦值給前面的name01, 如果nil則不執(zhí)行
if let name01 = name01{
    print(name01)
}

可選類(lèi)型的應(yīng)用

  • 如果url中有中文掏击,url就是空的卵皂;如果按照之前oc的方法就直接把空值傳進(jìn)request中了;
    如果在可選類(lèi)型中砚亭,如果為空灯变,那么就不會(huì)強(qiáng)制解包,也不會(huì)調(diào)用request方法
let url: NSURL? = NSURL(string: "http://www.baidu.comd")

if let url = url {
    let request = NSURLRequest(url: url as URL)
}

let path: String? = Bundle.main.path(forResource: "zhang.plist", ofType: nil)


可選類(lèi)型的幾種常見(jiàn)應(yīng)用(補(bǔ)充)

  • 1捅膘,字符串和數(shù)字之間的直接轉(zhuǎn)換

為什么要轉(zhuǎn)換結(jié)果是可選類(lèi)型:
轉(zhuǎn)換成功那么結(jié)果是字符串添祸,如果轉(zhuǎn)換不成功,那么結(jié)果返回nil寻仗,這樣的話轉(zhuǎn)換結(jié)果就不僅僅是一個(gè)類(lèi)型刃泌,那么只能用泛型,所以選擇了可選類(lèi)型愧沟,然后再轉(zhuǎn)換后進(jìn)行解包即可進(jìn)行安全的使用蔬咬。
(如果結(jié)果只是Int類(lèi)型的話,轉(zhuǎn)換不成功程序就會(huì)直接奔潰)

let str: String = "123"
let num: Int? = Int(str)//用可選類(lèi)型可以在取值不成功的時(shí)候賦值為空沐寺,而不是直接報(bào)錯(cuò)崩潰
//因而可以賦值為可選類(lèi)型林艘,通過(guò)可選綁定對(duì)可選類(lèi)型進(jìn)行解包
if let num = num {
    print(num)
}

  • 2,根據(jù)文件名取文件路徑
let path: String? = Bundle.main.path(forResource: "zhang.plist", ofType: nil)
path//當(dāng)然左邊也可以賦值為字符串混坞,那么右邊就需要強(qiáng)制解包狐援,如果為空,直接崩潰

if let path = path {
    print(path)
}

  • 3究孕, 字符串轉(zhuǎn)成url
let url = URL(string: "http://wwwzhang在.baidu.com")
if let url = url {
    print(url)
}
  • 4啥酱,從字典中取出元素

  • any類(lèi)型和any的可選類(lèi)型是兩種類(lèi)型,如果根據(jù)鍵取可能取到值厨诸,也可能取不到值镶殷,所以從字典或者字符串中取得的值的類(lèi)型是any的可選類(lèi)型,需要進(jìn)行解包后才是any類(lèi)型*

let dict:[String : Any] = ["name":"zhang","age":20,"num":200]

let namezzz: Any? = dict["dd"]

print(namezzz ?? "取值錯(cuò)誤微酬,可能是鍵值不對(duì)")

if let namezzz = namezzz {
    print(namezzz)
}

類(lèi)型轉(zhuǎn)換

as ? 轉(zhuǎn)換成可選類(lèi)型绘趋,所以如果結(jié)果沒(méi)有會(huì)直接返回為nil颤陶,不會(huì)崩潰
as ! 轉(zhuǎn)換成具體類(lèi)型,所以如果結(jié)果會(huì)直接崩潰

let str01 = "www.baidu.com"
(str01 as NSString).substring(to: 6)
  • 1陷遮,as ?:轉(zhuǎn)換成一個(gè)可選類(lèi)型滓走,系統(tǒng)判斷之后,如果可以轉(zhuǎn)化成功帽馋,則轉(zhuǎn)化可選類(lèi)型搅方,轉(zhuǎn)化不成功則返回nil

let name01 = dict["name"] as? String//as ?在轉(zhuǎn)化失敗的時(shí)候會(huì)返回nil,而如果用as !绽族,那么直接崩潰哦
if let name01 = name01 {
    print(name01)
}

//上面代碼簡(jiǎn)化:
if let name01 = dict["name"] as? String{
    print(name01)
}
//這一步和直接不適用as ?的區(qū)別在于:有時(shí)候不能確定name對(duì)應(yīng)的值是字符串的時(shí)候可以先轉(zhuǎn)化一下姨涡,如果已經(jīng)知道肯定是字符串,則可以直接不用as ?


  • 2吧慢,as !:轉(zhuǎn)換成一個(gè)具體類(lèi)型绣溜,系統(tǒng)判斷之后,如果可以轉(zhuǎn)化成功娄蔼,則轉(zhuǎn)化可選類(lèi)型怖喻,轉(zhuǎn)化不成功則崩潰
let name02 = dict["name"] as! String//as ?在轉(zhuǎn)化失敗的時(shí)候會(huì)返回nil,而如果用as !岁诉,那么直接崩潰哦
print(name02)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锚沸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涕癣,更是在濱河造成了極大的恐慌哗蜈,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坠韩,死亡現(xiàn)場(chǎng)離奇詭異距潘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)只搁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)音比,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人氢惋,你說(shuō)我怎么就攤上這事洞翩。” “怎么了焰望?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵骚亿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我熊赖,道長(zhǎng)来屠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮俱笛,結(jié)果婚禮上绣檬,老公的妹妹穿的比我還像新娘。我一直安慰自己嫂粟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布墨缘。 她就那樣靜靜地躺著星虹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镊讼。 梳的紋絲不亂的頭發(fā)上宽涌,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音蝶棋,去河邊找鬼卸亮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛玩裙,可吹牛的內(nèi)容都是我干的兼贸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吃溅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溶诞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起决侈,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤螺垢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赖歌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體枉圃,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年庐冯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孽亲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡展父,死狀恐怖墨林,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情犯祠,我是刑警寧澤旭等,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站衡载,受9級(jí)特大地震影響搔耕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一弃榨、第九天 我趴在偏房一處隱蔽的房頂上張望菩收。 院中可真熱鬧,春花似錦鲸睛、人聲如沸娜饵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箱舞。三九已至,卻和暖如春拳亿,著一層夾襖步出監(jiān)牢的瞬間晴股,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工肺魁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留电湘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓鹅经,卻偏偏與公主長(zhǎng)得像寂呛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘾晃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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