貓貓分享忘瓦,必須精品
原創(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
(小明家的貓:沒有你讓我玩蛇啊)