使用变量属性在Swift中对数组进行排序?

时间:2015-08-12 09:55:17

标签: arrays swift sorting

我有一个带有数组数据源的NSTableView,当用户点击列标题时我会对其进行排序。目前我有一些IF语句对每个列名称进行升序/降序排序。是否可以使用变量属性名称执行排序?也就是说,在下面的例子中,我可以使用包含属性名称而不是.name的变量来代替硬编码。

tableContents.sort {
    $0.name.localizedCaseInsensitiveCompare($1.name) == NSComparisonResult.OrderedAscending
}

这确实有效,但我必须为表中的每一列复制此内容

1 个答案:

答案 0 :(得分:1)

如果用于排序的所有属性具有相同的类型,则可以使用内置键值访问。请考虑以下类A,其中包含两个属性ab,这两个属性都是字符串。

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")]

要根据ab的值对此数组进行排序,您可以使用以下内容。

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"