協(xié)議
protocol Drawable.png
class Person Drawable {.png
設(shè)置協(xié)議后有自動補齊,而且是必實現(xiàn)骨田,不然會報錯的耿导。
Static、class
為了保證類與結(jié)構(gòu)體都能夠使用态贤,協(xié)議中必須用static定義類型方法舱呻、類型屬性、類型下標(biāo)
protocol Drawable.png
不為 static 會報錯
mutating
協(xié)議中的實例方法需要使用mutating來修飾
protocol Drawable.png
init
- 協(xié)議中還可以定義初始化器 init
- 非final類實現(xiàn)時必須加上required
protocol Drawable.png
protocol Drawable {.png
- 從協(xié)議實現(xiàn)的初始化器悠汽,剛好是重寫了父類的指定初始化器
- 那么這個初始化必須同時加required箱吕、override
protocol Livable.png
init、init?柿冲、init!
協(xié)議中定義的init?茬高、init!,可以用init假抄、init?怎栽、init!實現(xiàn)
協(xié)議中定義的init, 可以用init宿饱、init!去實現(xiàn)
protocol Livable{.png
協(xié)議的繼承
一個協(xié)議可以繼承其他協(xié)議(個人理解有點像分類)
protocol Runnable {.png
協(xié)議組合
func fne(obj Person).png
同時遵守多種條件
= typealias RealPerson = Livable & Runnable & Person.png
將協(xié)議寫成變量的方式
CaseIterable
enum Season.png
讓枚舉遵守CaseIterable協(xié)議熏瞄,可以實現(xiàn)遍歷枚舉值
CustomStringConvertible
class Porson CustonStringConvertible, CustombebugStringConvertsble {.png
實現(xiàn)CustomStringConvertible協(xié)議后,print打印的函數(shù)為 description 的實現(xiàn)
實現(xiàn)CustomDebugStringConvertible協(xié)議后谬以,debugPrint打印的函數(shù)為 debugDescription 的實現(xiàn)
X.self 巴刻、 X.Type 、 AnyClass
X.self是一個元類型(metadata)的指針蛉签,metadata存放著類型相關(guān)信息
X.self 屬于X.Type類型
var perType Person. Type = Person.self.png
public typealias AnyClass = AnyObject. Type.png
定義一種type
var anyType2 AnyClass = Person.self.png
AnyClass等于AnyObject.Type 包含了所有類型
per = Person().png
type(of: per) 等同于Person.self
看似是一個函數(shù)胡陪,但是不會使用到棧,說明進(jìn)行了優(yōu)化碍舍。
元類型的應(yīng)用
class Animal { required init() {} }.png
AnyObject.Self 等價于 [AnyObject class]
使用場景柠座,讓不同類型做相同的事情
或者為不知道的類型留下操作空間
class Porson.png
Swift同樣可以使用Runtime的一些方法
如果一個Swift類,沒有繼承其他類片橡,這個類就被叫做 base類
但是其實在底層實現(xiàn)下妈经,base類也是有父類的:SwiftObject
很容易理解,編譯器為了滿足公共方法捧书,肯定是有一個公共類的