考虑这个结构:
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
结构现在按名称排序。
但如果我希望能够按name
或age
排序,有什么方法可以使<
func成为通用的?
答案 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
}