為 Protocol 採用的 Protocol 提供預設實作 — extension 的限制和解法
Jul 25, 2017 · 2 min read
上一回的緣起中有提到 Protocol 的 extension 沒有辦法幫另外一個 Protocol 提供預設實作。原因是 Swift 不允許 Protocol 的 extension 去繼承另外一個 Protocol 。
很簡單的解法就是把對另外一個 Protocol 的使用,提升到 Protocol 宣告的地方即可:
protocol ProductType: Equatable {} // ← 移動到這裡extension ProductType {
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.name == rhs.name
}
}
但是這樣子就有一個缺點,這個 extenstion 就很難看出來他是什麼的實作:是從零開始自己的定義?還是其實是實作某個 Protocol 裡面的方法?
目前有想到比較好的解法就是加上 MARK 來標示:
protocol ProductType: Equatable {}// MARK: - Equatable
extension ProductType {
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.name == rhs.name
}
}
