我有一个带有数组数据源的NSTableView,当用户点击列标题时我会对其进行排序。目前我有一些IF语句对每个列名称进行升序/降序排序。是否可以使用变量属性名称执行排序?也就是说,在下面的例子中,我可以使用包含属性名称而不是.name的变量来代替硬编码。
tableContents.sort {
$0.name.localizedCaseInsensitiveCompare($1.name) == NSComparisonResult.OrderedAscending
}
这确实有效,但我必须为表中的每一列复制此内容
答案 0 :(得分:1)
如果用于排序的所有属性具有相同的类型,则可以使用内置键值访问。请考虑以下类A
,其中包含两个属性a
和b
,这两个属性都是字符串。
class A: NSObject, Printable {
var a: String
var b: String
init(a: String, b: String) {
self.a = a
self.b = b
}
override var description: String {
return "{ a: \(self.a), b: \(self.b) }"
}
}
假设你的表内容是从这个类的实例构建的。
var tableContents = [A(a: "1", b: "2"), A(a: "2", b: "1")]
要根据a
或b
的值对此数组进行排序,您可以使用以下内容。
tableContents.sort {
let key = "a"
let oneValue = $0.valueForKey(key) as! String
let otherValue = $1.valueForKey(key) as! String
return oneValue.localizedCaseInsensitiveCompare(otherValue) == NSComparisonResult.OrderedAscending
}
println(tableContents) // [{ a: 1, b: 2 }, { a: 2, b: 1 }]
tableContents.sort {
let key = "b"
let oneValue = $0.valueForKey(key) as! String
let otherValue = $1.valueForKey(key) as! String
return oneValue.localizedCaseInsensitiveCompare(otherValue) == NSComparisonResult.OrderedAscending
}
println(tableContents) // [{ a: 2, b: 1 }, { a: 1, b: 2 }]
比较块的唯一区别是使用let key = "a"
或let key = "b"
。