【问题标题】:Compare protocol in Swift class hierarchies比较 Swift 类层次结构中的协议
【发布时间】:2016-01-11 06:30:25
【问题描述】:

我有 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

【问题讨论】:

    标签: swift swift2 protocols


    【解决方案1】:

    泛型来拯救。使您的 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
    

    【讨论】:

      【解决方案2】:

      覆盖&lt; 运算符应该采用最具体的匹配,所以在你的情况下

      func <(lhs: Thing, rhs: Thing) -> Bool {
          print("Base");
          return lhs.name < rhs.name
      }
      
      func <(lhs: Subthing, rhs: Thing) -> Bool {
          print("Child");
          return lhs.name < rhs.name
      }
      
      Subthing(name: "a") < Thing(name: "b")
      

      应该打印Child,但这不会发生。

      使用泛型重载似乎可以工作:

      func < <T1:Thing, T2: Thing>(lhs: T1, rhs: T2) -> Bool {
          print("Base");
          return lhs.name < rhs.name
      }
      
      func < <T1: Subthing, T2: Thing>(lhs: T1, rhs: T2) -> Bool {
          print("Child");
          return lhs.name < rhs.name
      }
      
      Subthing(name: "a") < Thing(name: "b")
      

      正确打印Child

      似乎泛型重载比基本重载有更好的类型匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多