如何实现Swift的Comparable协议?

时间:2014-06-20 19:54:24

标签: compare protocols swift

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

3 个答案:

答案 0 :(得分:57)

Comparable协议扩展了Equatable协议 - >实施两者

Apple's Reference中是Apple的一个示例(在可比协议参考中),您可以看到如何执行此操作:不要将操作实现放在类中,而是放在外部/全局范围。此外,您只需要从<协议实施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

答案 1 :(得分:3)

为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
}

}

//然后从其他地方打电话

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

答案 2 :(得分:0)

要实现Swift的Comparable协议,您需要首先通过实现Equatable来遵循static func == (lhs: Self, rhs: Self) -> Bool协议,然后为{{1}实现唯一所需的功能static func < (lhs: Self, rhs: Self) -> Bool }。

代替声明全局运算符重载,您应该在struct / class本身中实现符合协议的方法。尽管全局运算符重载满足协议一致性,但是以这种方式声明它们而不是在struct / class上使用预期的静态方法是一种不好的做法。

如果查看文档示例,您将看到与示例代码相同的内容。

我改写以下内容:

Comparable

甚至从类声明中分离出协议一致性,如下所示:

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
    }
}

这可能更接近生产级代码。