我知道Swift中泛型的局限性以及它们存在的原因所以这不是关于编译器错误的问题.相反,我偶尔遇到的情况似乎应该可以通过可用资源的某种组合(即泛型,关联类型/协议等)来实现,但似乎无法找到解决方案.
在这个例子中,我试图为NSSortDescriptor提供一个Swift替换(只是为了好玩).当你只有一个描述符时它很完美,但是,正如通常使用NS版本一样,创建一个SortDescriptors数组以对多个键进行排序会很好.
这里的另一个试验是使用Swift KeyPaths.因为那些需要Value类型并且比较需要Comparable值,所以我很难找出在何处/如何定义类型以满足所有要求.
这可能吗?这是我提出的最接近的解决方案之一,但是,正如您在底部看到的那样,在构建阵列时它不足.
同样,我理解为什么这不起作用,但我很好奇是否有办法实现所需的功能.
struct Person {
let name : String
let age : Int
}
struct SortDescriptor<T, V:Comparable> {
let keyPath: KeyPath<T,V>
let ascending : Bool
init(_ keyPath: KeyPath<T,V>, ascending:Bool = true) {
self.keyPath = keyPath
self.ascending = ascending
}
func compare(obj:T, other:T) -> Bool {
let v1 = obj[keyPath: keyPath]
let v2 = other[keyPath: keyPath]
return ascending ? v1 < v2 : v2 < v1
}
}
let jim = Person(name: "Jim", age: 30)
let bob …Run Code Online (Sandbox Code Playgroud)