貓貓學swift3.1(二)可選類型_解包_可選鏈

貓貓分享忘瓦,必須精品

原創(chuàng)文章房官,歡迎轉(zhuǎn)載帚呼。轉(zhuǎn)載請注明:翟乃玉的博客
地址:http://www.reibang.com/notebooks/4236923/latest

一:可選類型簡介

  • 在oc中,如果一個對象我們沒有用到,如果他是基礎數(shù)據(jù)類型(int bool double float 這樣的不帶的),他會默認為0,如果他是對象類型(NSObject 帶的),默認會為nil
  • 在swift中,nil 也是一種數(shù)據(jù)類型 (補充:nil 的內(nèi)存地址是0x0),什么是可選類型,當一個標識符所代表的對象可以被賦值為nil時,這個標識符的類型就是一個可選類型.

1:可選類型的寫法

//寫法一:
var a1:Optional<String> = nil
a1 = "我是可選類型"
//寫法二:
var a2:String? = nil
a2 = "寫法二"

2:自己理解

其實,從寫法上我們很容易看出,可選類型其實是一個泛型集合,這個集合只有一個值,其實我們可以理解為是一個只有一個元素的數(shù)組,我們可以用數(shù)組的方式來研究可選類型的初始化,賦值等一系列操作.

var o1:[String] = [String]() //賦值nil
o1 = ["自己實現(xiàn)可選類型"] //賦值
let o1Value = o1.first //獲取到詳細數(shù)據(jù)

var o2:String? = nil//賦值nil
o2 = "自己實現(xiàn)可選類型"http://賦值

二: 可選類型的解包

場景描述:
首先我們描繪這樣一個場景
小玉有一只叫貝貝的貓,貝貝有一個叫"紙盒"的玩具
小明有一只沒有名字的貓,貓木有玩具 (小明一直都很屌絲...)
然后我們根據(jù)數(shù)據(jù)結(jié)構(gòu)簡單建造了以下三個類

class Person{
    var name:String
    var cat:Cat?
    init(name:String){
        self.name = name
    }
}
class Cat{
    var name:String?
    var toy:Toy?
    func eating(){
        print("貓在吃東西")
    }
}
class Toy{
    var name:String?
    func playing(who:String) {
        print("正在被\(who)玩ing...")
    }
}

//小玉:
let persion1 = Person(name: "小玉")
let cat1 = Cat()
cat1.name = "貝貝"
persion1.cat = cat1
let toy1 = Toy()
toy1.name = "紙盒"
cat1.toy = toy1

//小明:
let persion2 = Person(name: "小明")
let cat2 = Cat()
persion2.cat = cat2

1:解包

如果我們想拿到他們寵物的名字,我們會發(fā)現(xiàn),小明的寵物是無名,這時候我們就需要解包了,因為你拿到的是一個可選類型(可以是有名字的貝貝可以是無名的)

解包方式

//方式一: 強制解包!
let catName = persion1.cat?.name
print(catName!)

//方式二:可選綁定
if let catName = catName {
    print("可選綁定 ---- "+catName)
}
解包

三: 可選類型可選鏈

可選鏈介紹

swift 中我們在調(diào)用函數(shù)或者屬性的時候,用的是.
但是,上面在解包的時候,我用了一個?.
因為 每個人不一定都有一只貓(看類的數(shù)據(jù)結(jié)構(gòu)), 所以person的cat可能為nil,也就是cat是可選類型 var cat:Cat?
但是我們需要調(diào)用cat的一些方法,甚至是cat的玩具的方法,nil是沒有方法的,難道我們要一層層的解包? 太痛苦了, swift給了我們一個叫做可選鏈的方式 如下

//讓小玉家的貝貝吃飯
persion1.cat?.eating()
//讓小玉家的貝貝的玩具被玩
persion1.cat?.toy?.playing(who: "小玉家的貝貝")

// 沒有的情況 讓小明家的貓的玩具被玩
persion2.cat?.toy?.playing(who: "小明家的貓")
// 并沒有打印,因為小明家的貓的玩具是nil

(小明家的貓:沒有你讓我玩蛇啊)


可選鏈
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只磷,一起剝皮案震驚了整個濱河市庆杜,隨后出現(xiàn)的幾起案子简软,更是在濱河造成了極大的恐慌蛮拔,老刑警劉巖述暂,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異建炫,居然都是意外死亡畦韭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門肛跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艺配,“玉大人,你說我怎么就攤上這事衍慎∽Γ” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵稳捆,是天一觀的道長赠法。 經(jīng)常有香客問我,道長乔夯,這世上最難降的妖魔是什么砖织? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮驯嘱,結(jié)果婚禮上镶苞,老公的妹妹穿的比我還像新娘喳坠。我一直安慰自己鞠评,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布壕鹉。 她就那樣靜靜地躺著剃幌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晾浴。 梳的紋絲不亂的頭發(fā)上负乡,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音脊凰,去河邊找鬼抖棘。 笑死,一個胖子當著我的面吹牛狸涌,可吹牛的內(nèi)容都是我干的切省。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼帕胆,長吁一口氣:“原來是場噩夢啊……” “哼朝捆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懒豹,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤芙盘,失蹤者是張志新(化名)和其女友劉穎驯用,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒老,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蝴乔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驮樊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淘这。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖巩剖,靈堂內(nèi)的尸體忽然破棺而出铝穷,到底是詐尸還是另有隱情,我是刑警寧澤佳魔,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布曙聂,位于F島的核電站,受9級特大地震影響鞠鲜,放射性物質(zhì)發(fā)生泄漏宁脊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一贤姆、第九天 我趴在偏房一處隱蔽的房頂上張望榆苞。 院中可真熱鬧,春花似錦霞捡、人聲如沸坐漏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赊琳。三九已至,卻和暖如春砰碴,著一層夾襖步出監(jiān)牢的瞬間躏筏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工呈枉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趁尼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓猖辫,卻偏偏與公主長得像酥泞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子住册,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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