Swift基礎(chǔ)語法10-- 可選類型

前言

在OC中, 有時(shí)候我們定義了一個(gè)變量,但是暫時(shí)又不用它,此時(shí)我們的做法就是將其賦值為0(基本數(shù)據(jù)類型)或者nil(OC對象). 但是在Swift中, nil是一個(gè)特殊的類型, 如果與真在實(shí)的類型不匹配是不能對其賦值的(注意:OC是弱語言,Swift是強(qiáng)語言) , 但是在開發(fā)中很多時(shí)候我們都有賦值為nil的情況, 所以在swift中推出了可選類型

可選類型.png
  • 可選類型的概念

  • 可選類型: 所謂的可選類型就是說一個(gè)變量可能沒有值也有可能有值

  • 可選類型格式

格式: 修飾符 變量名稱: Optional<數(shù)據(jù)類型>
但是在swift提供類一個(gè)語法糖使用"?"代替了Optional
格式: 修飾符 變量名稱:數(shù)據(jù)類型?

  • 可選類型的定義
//  1, 首先我們來看看錯誤的寫法
 let str: String = nil   // 這里會直接報(bào)錯,不能給變量或者常量直接賦值為nil
//  2, 再來看看正確的寫法
 // 方式一:
 let str: Optional<String> = nil
 
 // 方式二: (推薦寫法)
 let str:String? = nil
  • 可選類型的使用
var name: String? = nil
print(name)

//name = 10086  // 注意一點(diǎn): 不同類型直接是不能賦值的,所以這里會報(bào)錯
name = "William"
print(name)
  • 強(qiáng)制解包

在Swift中如果我們使用了可選類型,那么在使用到該變量/常量時(shí),一定要進(jìn)行解包操作
格式: 只需要在變量或者常量后面加上"!"即可
"!"表示該變量或者常量是一定有值的,如果強(qiáng)制解包的變量或者常量是為空,那么Xcode會立即報(bào)錯

  • 注意點(diǎn):
  • 1, 在開發(fā)中最好不要強(qiáng)制解包一個(gè)可選類型,有時(shí)候會引發(fā)錯誤
  • 2, 在開發(fā)中盡量使用可選綁定: 比如說我有一個(gè)url,它可能有值,也可能沒有值,如果我們使用可選綁定,系統(tǒng)內(nèi)部會自動將解包后的值賦值給temp, 這樣的話,只有當(dāng)temp有值的時(shí)候才會執(zhí)行{}中的代碼.
// 可選類型的使用
/*
 這里我們直接使用語法糖的方式, 開發(fā)中用的幾乎都是用語法糖
 
 */
var name: String? = nil
print(name)

//name = 10086  // 注意一點(diǎn): 不同類型直接是不能賦值的,所以這里會報(bào)錯
name = "William"
print(name)
/*
 這里需要注意: 打印出來的結(jié)果是Optional<"William"> : 表示的意思是:name是一個(gè)可選類型,并且可選類型中存儲的是一個(gè)William的字符串
 
 如果想要去除Optiopnal可以直接對其做解包操作 即:可選類型 + 感嘆號("!")
 */
print(name!)

特別注意: 在使用可選類型取值時(shí), 需要通過感嘆號!來取值,這個(gè)操作我們常常稱之為"強(qiáng)制解包"
強(qiáng)制解包的意義是告訴Xcode該變量或者常量是一定有值的, 如果強(qiáng)制解包一個(gè)沒有值得可選類型,程序會直接崩掉, 所以說強(qiáng)制解包是一個(gè)非常危險(xiǎn)的操作
解決的方法就是在強(qiáng)制解包之前進(jìn)行一個(gè)判斷,判斷可選類型是否為空(但是不推薦使用),因?yàn)槊看卧L問的時(shí)候都會要使用"!"

  • 可選綁定
  • 判斷可選類型是否有值, 如果有值,則就會執(zhí)行{}中的代碼
    換句話說: 如果可選類型有值則系統(tǒng)內(nèi)部就會對可選類型進(jìn)行解包,并且將值賦值給temp
    之后就能通過temp進(jìn)行訪問可選類型

解釋一下: 在實(shí)際開發(fā)中,比如說用到網(wǎng)絡(luò)地址時(shí),獲取到的地址可能是有值,也有可能是沒有值得,所以在開發(fā)中最好不要直接強(qiáng)制解包,如果說可選類型為空,你再去強(qiáng)制解包,程序就是直接崩掉.所以在強(qiáng)制解包之前最好是判斷一下可選類型是否為空.有以下兩種方式.

  • 直接使用if判斷
let number: String?

// 如果直接解包,就會直接報(bào)錯
//print(number!)
number = "15989854481"

// 方式一: 不推薦使用這種方式
if number != nil {
    print(number!)
}
  • 可選綁定
let number: String?

// 如果直接解包,就會直接報(bào)錯
//print(number!)
number = "15989854481"

if let temp = number {
    print(temp)
}

  • 可選類型的實(shí)例
//let URL: NSURL? = NSURL(string: "http://www.baidu.com")
let URL = NSURL(string: "http://www.baidu.com")
print(URL!)  //這樣一點(diǎn)都不嚴(yán)謹(jǐn),如果URL中有特殊字符或者漢字或者為空,那么這里就會報(bào)錯

// 解決方法 : 先判斷是否為空或者可選綁定
// 方式一: 判斷 (但是不推薦使用,因?yàn)槊看卧L問都需要使用!)
if URL != nil {
print(URL!)
}

// 方式二: 可選綁定 (推薦使用)
let URL = NSURL(string: "http://www.baidu.com")
print(URL!)  //這樣一點(diǎn)都不嚴(yán)謹(jǐn),如果URL中有特殊字符或者漢字或者為空,那么這里就會報(bào)錯
if let temp = URL {
print(temp)
    temp
}

  • 實(shí)例 2
let view: UIView = UIView()
view.frame = CGRectMake(100, 100, 50, 50)
view.backgroundColor = UIColor.redColor()
print(view.backgroundColor)


if let colorTemp = view.backgroundColor {
print(colorTemp)
}

  • 實(shí)例總結(jié)

比如說在開發(fā)中常常會通過一個(gè)url去請求數(shù)據(jù),但是這個(gè)url可能有值也有可能沒有值,比如說在url中有漢字的情況,所以就會返回一個(gè)nil的url, 所以url就是一個(gè)可選類型.
// 錯誤寫法: 直接就會報(bào)錯
let url; NSURL = NSURL(string: "www.baidu.com")

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市矩桂,隨后出現(xiàn)的幾起案子姆泻,更是在濱河造成了極大的恐慌纹腌,老刑警劉巖坊饶,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異初嘹,居然都是意外死亡碴裙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門陶缺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钾挟,“玉大人,你說我怎么就攤上這事饱岸〔舫觯” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵苫费,是天一觀的道長汤锨。 經(jīng)常有香客問我,道長黍衙,這世上最難降的妖魔是什么泥畅? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮琅翻,結(jié)果婚禮上位仁,老公的妹妹穿的比我還像新娘。我一直安慰自己方椎,他們只是感情好聂抢,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棠众,像睡著了一般琳疏。 火紅的嫁衣襯著肌膚如雪有决。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天空盼,我揣著相機(jī)與錄音书幕,去河邊找鬼。 笑死揽趾,一個(gè)胖子當(dāng)著我的面吹牛台汇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篱瞎,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼苟呐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俐筋?” 一聲冷哼從身側(cè)響起牵素,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澄者,沒想到半個(gè)月后笆呆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粱挡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年腰奋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抱怔。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘀倒,靈堂內(nèi)的尸體忽然破棺而出屈留,到底是詐尸還是另有隱情,我是刑警寧澤测蘑,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布灌危,位于F島的核電站,受9級特大地震影響碳胳,放射性物質(zhì)發(fā)生泄漏勇蝙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一挨约、第九天 我趴在偏房一處隱蔽的房頂上張望味混。 院中可真熱鬧,春花似錦诫惭、人聲如沸翁锡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馆衔。三九已至瘟判,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間角溃,已是汗流浹背拷获。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留减细,地道東北人匆瓜。 一個(gè)月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像邪财,于是被迫代替她去往敵國和親陕壹。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

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