我如何实现Swift的Comparable协议?

Kam*_*xom 34 compare protocols swift

如何在Swift中使用Comparable协议?在声明中它说我必须实现三个操作<,<=和> =.我把所有这些都放在课堂上,但它不起作用.我还需要拥有这三个吗?因为应该可以从一个推断出所有这些.

Kam*_*xom 59

Comparable协议扩展了Equatable协议 - >实现它们

Apple的Reference中Apple的一个例子(在Comparable协议参考中),您可以看到如何执行它:不要将操作实现放在类中,而是放在外部/全局范围内.你也只需要实现<从运营商Comparable协议,==Equatable协议.

正确的例子:

class Person : Comparable {
    let name : String

    init(name : String) {
        self.name = name
    }
}

func < (lhs: Person, rhs: Person) -> Bool {
    return lhs.name < rhs.name
}

func == (lhs: Person, rhs: Person) -> Bool {
    return lhs.name == rhs.name
}

let paul = Person(name: "Paul")
let otherPaul = Person(name: "Paul")
let ben = Person(name: "Ben")

paul > otherPaul  // false
paul <= ben       // false
paul == otherPaul // true
Run Code Online (Sandbox Code Playgroud)

  • @fjlksahfob的原因是因为它在类外的范围内向运算符添加了扩展.如果你愿意,你甚至可以做一些像`func ==(lhs:ClassA,rhs:ClassB) - > Bool`这样比较两个不同的类(从测试它看起来只能按照指定的方向工作,所以你也可以创建`func ==(lhs:ClassB,rhs:ClassA) - > Bool`).换句话说,Swift编译器将`(X == Y)`解释为`==(X,Y)`而不是`X.==(Y)` (5认同)
  • 当实际代码根本不在类中时,我不知道如何将其视为"已实现"...不应该= = <并且所有其余的都在类中吗?然而,当我尝试我得到错误时......你知道我不明白吗? (2认同)

Ekr*_*kra 5

这是 Kametrixom 对Swift 3的回答的更新:

class Person : Comparable {

    let name : String

    init(name : String) {
        self.name = name
    }    

    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.name < rhs.name
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.name == rhs.name
    }
}
Run Code Online (Sandbox Code Playgroud)

Person然后可以将类的实例与关系运算符进行比较,如下所示:

let paul = Person(name: "Paul")
let otherPaul = Person(name: "Paul")
let ben = Person(name: "Ben")

print(paul > otherPaul)  // false
print(paul <= ben)       // false
print(paul == otherPaul) // true
Run Code Online (Sandbox Code Playgroud)