swift - 比较 Swift 类层次结构中的协议(protocol)

标签 swift swift2 protocols

我有一个包含 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

最佳答案

泛型来拯救。使您的 EquatableComparable 函数通用。 将 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/

相关文章:

ios - UIView 子类及其 subview 的 IBAction

ios - '#selector' 的参数未引用初始化程序或方法

xcode - 从 swift osx 应用程序发送电子邮件

swift - 从 UIImagePickerController 获取 NSURL

swift - 如何在 swift 中对 UIAlertController 的文本字段进行自动完成

swift - 注释支持符合协议(protocol)的 Swift 函数声明?

ios - 带有按钮和选择器的协议(protocol)扩展

swift - 为什么桥接 header 中的附加#import swift 失败?

iOS - 在 ImageView 上点击手势问题

ios - 如何访问项目 > build设置 > 其他 Swift 标志中定义的值?