Comparable协议可以通用吗?

时间:2017-06-25 00:16:54

标签: swift generics swift-protocols

考虑这个结构:

struct Person : Comparable {
    let name: String
    let age: Int
}

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

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

Person结构现在按名称排序。

但如果我希望能够按nameage排序,有什么方法可以使< func成为通用的?

2 个答案:

答案 0 :(得分:2)

您不能使协议通用。有两种方法可以解决您的问题:

您可以创建一个仅包含Person值的包装器结构,但可以通过不同的属性组合进行排序。

或者,您可以想出一种方法来组合比较两件事的方法。我们在Swift Talk剧集中完成了这项工作:https://talk.objc.io/episodes/S01E19-from-runtime-programming-to-functions(如果您不想观看视频,可以阅读成绩单。)

答案 1 :(得分:1)

试试这个:

struct Person : Comparable {
    let name: String
    let age: Int
    let compareByAge: Bool
}

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

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