本小節的知識點比較單一,主要是圍繞帶有Self的協議來說的git
當咱們的協議中須要引入自身相關的參數或者返回自身相關的返回值的時候用self (書中並無明確的解鎖,外國大佬寫的書直接上了就幹demo了。上面對self的解釋是我查了不少資料的結果,看起來的確是廢話,哈哈但讓解釋也只能這樣解釋😄)github
帶有 Self 要求的協議在行爲上和那些帶有關聯類型的協議
很類似swift
最簡單的是 Equatable函數
protocol Equatable {
static func ==(lhs: Self, rhs: Self) -> Bool
}
複製代碼
咱們來寫一個最簡單的帶有self協議的Demo。 一眼一看就會了😼學習
protocol GHEqual {
///這裏引入了self
static func == (lhs: Self, rhs: Self) -> Bool
}
class Person: NSObject, GHEqual {
var gender: String = ""
///這裏實現的時候系統會自動將self替換成了具體的類型。
static func == (lhs: Person, rhs: Person) -> Bool {
if lhs.gender == rhs.gender {
return true
} else {
return false
}
}
}
let personA = Person()
personA.gender = "male"
let personB = Person()
personB.gender = "male"
let isSame = (personA == personB) ///true
複製代碼
在咱們的認知中上面用到的 == 應該是對象方法。 爲嘛在協議中聲明的時候會用 static func? 我目前的結論是在協議中寫操做符號時 對象方法也是用static func? 各位大佬能夠把大家的想法分享出來。你們一塊兒學習一下😄。ui
後來我查閱資料,在StackOverflow中有人提到了這個問題 Why must a protocol operator be implemented as a global function? 其大概解釋就是 因爲swift語法的緣由,操做符的實現必須是一個全局函數。
感興趣的同窗能夠看看問題中大牛們的回答。spa
和上一節的關聯類型協議同樣,咱們不能把帶有self的協議做爲類來變量聲明code
let x: Equatable = MonetaryAmount(currency: "EUR", amountInCents: 100)
// 會編譯錯誤:由於 'Equatable' 協議中有 Self 或者關聯類型的要求,
// 因此它只能被⽤用做泛型約束
複製代碼