Optional
-
Optional
是通過enum
實(shí)現(xiàn)的一個(gè)非常好的代表凝果,這里我們可以通過閱讀Optional
的源碼來看一下:
- 可以看到
Optional
本質(zhì)上是一個(gè)枚舉,當(dāng)前枚舉接受一個(gè)泛型參數(shù)具钥,而當(dāng)前some
關(guān)聯(lián)的值是Wrapped
豆村,也就是說下面兩種寫法是一樣的
var age : Int?
var age : Optional<Int>
- 枚舉我們可以通過模式匹配來匹配對(duì)應(yīng)的值
var age : Int? = 10
switch age {
case .none :
print("nil")
case .some(10) :
print(10)
default :
print("default")
}
Optional解包
- 涉及到
Optional
我們就不得不面對(duì)一個(gè)問題:解包。因?yàn)楫?dāng)前的可選項(xiàng)其實(shí)是對(duì)我們的值做了包裝骂删, 當(dāng)前不為nil
的時(shí)候我們就需要從其中拿到我們要的值掌动。
強(qiáng)制解包
-
簡(jiǎn)單粗暴,但是如果值為nil就會(huì)崩潰
if let
&guard let
- 實(shí)際開發(fā)中解包通常是使用
if let
和guard let
宁玫,這里我們是通過可選項(xiàng)綁定的方式來判斷當(dāng)前的可選項(xiàng)是否有值粗恢,我們看一下寫法:
if let tmp = age {
print(tmp)
}else{
print("nil")
}
func test() {
guard let guardTmp = age else {return}
print(guardTmp)
}
test()
- 可以看到
guard
后面的判斷條件為else
的時(shí)候會(huì)執(zhí)行當(dāng)前大括號(hào)里面的內(nèi)容,反之執(zhí)行后面的代碼欧瘪。guard
在我們當(dāng)前這句代碼里面作用就是如果當(dāng)前age
為空眷射,我們就退出我們當(dāng)前函數(shù)。 - 其次佛掖,大家來看一個(gè)點(diǎn):我們?cè)谑褂?code>if let創(chuàng)建的內(nèi)容當(dāng)中
tmp
僅僅只能在當(dāng)前if
分支的大括號(hào)內(nèi)訪問到妖碉,而我們當(dāng)前的guard
定義的guardTmp
在當(dāng)前大括號(hào)外部也是能訪問到的。
Equatable
-
Swift
中的類型芥被,可以通過遵循Equatable
協(xié)議來使用相等運(yùn)算符==
和不等運(yùn)算符?=
來比較兩個(gè)值相等還是不相等欧宜。Swift
標(biāo)準(zhǔn)庫中絕大多數(shù)的類型都默認(rèn)實(shí)現(xiàn)了Equatable
協(xié)議。
var age = 10
var age1 : Int = 10
var isEqual = age == age1
print(isEqual)
// 返回結(jié)果為true
- 對(duì)于
Int
來說拴魄,系統(tǒng)默認(rèn)實(shí)現(xiàn)了==
冗茸,對(duì)于我們自定義的的類型,我們需要遵循Equatable
協(xié)議 - 如果是值類型
struct XQTeacher : Equatable{
var age : Int
var name : String
}
var t = XQTeacher(age: 18, name: "xq")
var t1 = XQTeacher(age: 19, name: "xq")
var t2 = XQTeacher(age: 18, name: "xq")
print(t == t1)
print(t == t2)
// 返回結(jié)果為false true
-
觀察下sil代碼匹中,看看它是怎么實(shí)現(xiàn)的夏漱,系統(tǒng)幫我們實(shí)現(xiàn)了一個(gè)函數(shù)
-
函數(shù)的實(shí)現(xiàn),通過取出兩個(gè)結(jié)構(gòu)體顶捷,取出結(jié)構(gòu)體的屬性依次比較
-
如果是引用類型挂绰,編譯器就會(huì)報(bào)錯(cuò),需要我們實(shí)現(xiàn)對(duì)應(yīng)的函數(shù)
==
根據(jù)提示完善代碼
class XQTeacher : Equatable{
static func == (lhs: XQTeacher, rhs: XQTeacher) -> Bool {
return lhs.age == rhs.age && lhs.name == rhs.name
}
var age : Int
var name : String
init(age : Int , name :String) {
self.age = age
self.name = name
}
}
var t = XQTeacher.init(age: 18, name: "xq")
var t1 = XQTeacher.init(age: 19, name: "xq")
print(t == t1)
- 經(jīng)過上面的學(xué)習(xí)服赎,可以看到
==
用來檢驗(yàn)值是否相等扮授,也就是equal to
; -
===
是用來檢驗(yàn)兩個(gè)對(duì)象是否是同一個(gè)實(shí)例對(duì)象是否是同一個(gè)
訪問控制權(quán)限
-
Swift
當(dāng)中主要是針對(duì)其他源文件和模塊對(duì)你代碼的訪問控制芳室,這里我們先來總結(jié)一下Swift
中的有關(guān)訪問控制權(quán)限的關(guān)鍵字-
private
:訪問級(jí)別僅在當(dāng)前定義的作用域內(nèi)有效 -
filePrivate
:此訪問限制僅限制在當(dāng)前定義的源文件中 -
Internal
:默認(rèn)訪問級(jí)別 允許定義模塊中的任意源文件訪問专肪,但不能被該模塊之外的任意源文件訪問 -
public
: 開放式訪問刹勃,使我們能夠在其定義模塊的任何源文件中使用代碼,并且可以從另一個(gè)源文件訪問源文件嚎尤。只能在定義的模塊中繼承和子類的重寫 -
Open
:最不受限制的訪問級(jí)別
-