我有一个包含 2 个 Swift 类的层次结构,需要它们来实现 Comparable
:
class Thing : Comparable {
var name = "Thing"
init(name : String){
self.name = name
}
}
class Thingy: Thing {
override init(name: String){
super.init(name: "Thingy")
}
}
func ==(lhs: Thing, rhs:Thing)->Bool{
return lhs.name == rhs.name
}
为了遵守Comparable
,我需要实现这个功能:
func <(lhs: Thing, rhs: Thing) -> Bool{
return lhs.name < rhs.name
}
到目前为止一切顺利,但是如果我需要针对不同子类型的特定 < 函数会发生什么,例如:
func <(lhs: SubThing, rhs: Thing) -> Bool{
return lhs.name < rhs.name
}
我应该怎么做?编译器似乎忽略了这最后的声明。
如果类型倒置,它是否也有效?
lhs: SubThing, rhs: Thing
代替
lhs: Thing, rhs: SubThing
最佳答案
泛型来拯救。使您的 Equatable
、Comparable
函数通用。
将 T
约束为 Thing
的子类。
func ==<T:Thing>(lhs: T, rhs:T) -> Bool {
return lhs.name == rhs.name
}
let a = Thing(name: "alpha")
let b = Thingy(name: "beta")
a == b // false
关于swift - 比较 Swift 类层次结构中的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715415/