爲什麼你應該三思而後有一協議符合Equatable
的原因是,在許多情況下,它只是沒有感。考慮下面這個例子:
protocol Pet: Equatable {
var age: Int { get }
}
extension Pet {
static func == (lhs: Pet, rhs: Pet) -> Bool {
return lhs.age == rhs.age
}
}
struct Dog: Pet {
let age: Int
let favoriteFood: String
}
struct Cat: Pet {
let age: Int
let favoriteLitter: String
}
let rover: Pet = Dog(age: "1", favoriteFood: "Pizza")
let simba: Pet = Cat(age: "1", favoriteLitter: "Purina")
if rover == simba {
print("Should this be true??")
}
你大概鍵入的==
實施內檢查,但問題是,你有沒有關於任何類型的信息超越他們是Pet
S和你不知道所有的事情,可能是Pet
(也許您稍後將添加Bird
和Rabbit
)。如果你真的需要這個,另一種方法可以模擬像C#語言中如何實現平等,這樣做是這樣的:
protocol IsEqual {
func isEqualTo(_ object: Any) -> Bool
}
protocol Pet: IsEqual {
var age: Int { get }
}
struct Dog: Pet {
let age: Int
let favoriteFood: String
func isEqualTo(_ object: Any) -> Bool {
guard let otherDog = object as? Dog else { return false }
return age == otherDog.age && favoriteFood == otherDog.favoriteFood
}
}
struct Cat: Pet {
let age: Int
let favoriteLitter: String
func isEqualTo(_ object: Any) -> Bool {
guard let otherCat = object as? Cat else { return false }
return age == otherCat.age && favoriteLitter == otherCat.favoriteLitter
}
}
let rover: Pet = Dog(age: "1", favoriteFood: "Pizza")
let simba: Pet = Cat(age: "1", favoriteLitter: "Purina")
if !rover.isEqualTo(simba) {
print("That's more like it.")
}
在這一點,如果你真的想要的,你可以實現==
沒有實現Equatable
:
static func == (lhs: IsEqual, rhs: IsEqual) -> Bool { return lhs.isEqualTo(rhs) }
這件事情你必須注意的一件事是繼承。因爲您可以下傳一個繼承類型並刪除可能使isEqualTo
不符合邏輯意義的信息。
最好的方法是隻實現類/結構本身的平等,並使用另一種機制進行類型檢查。
謝謝。我試圖避免約束一個協議擴展到一個類,因爲(也許這是一個壞主意,但它適用於我的情況)我有不同的協議實現,實際上指的是同樣的事情,因此我希望他們被認爲是平等的 – drekka