如何在Swift中按属性对结构进行排序

时间:2015-04-08 18:14:18

标签: swift sorting

我正在尝试根据其属性对结构数组进行排序。

假设我想按x坐标对NSViews数组进行排序。

我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

它是一个非常漂亮的解决方案,它被称为闭包表达式语法。

您需要做的是:

let sortedArray = sorted(allViewsArray, { (p1: NSView, p2: NSView) -> Bool in
            return p1.frame.origin.x < p2.frame.origin.x
        })

这会将alLViewsArray从最大X坐标排序到最小坐标,并将其存储在sortedArary

答案 1 :(得分:2)

注意,你可以稍微简化语法,这通常有助于提高可读性(重点是你正在做的事情,而不是类型的语法等):

let sortedArray = sorted(allViewsArray) {
    $0.frame.origin.x < $1.frame.origin.x
}

尾随闭包可以在函数调用parens之外,类似于ifwhile等其他块结构;如果闭包表达式是单个语句,则可以跳过return,并且可以跳过函数签名并使用$0$1等作为参数名称。

最后一个最好只在没有更多有用的名称时使用(例如p1不比$0更具描述性)。如果您确实想要给它们命名,您仍然可以跳过以下类型:

let sortedArray = sorted(allViewsArray) { p1, p2 in
    p1.frame.origin.x < p2.frame.origin.x
}

当应用这种语法糖时,Swift有时会有点脆弱,所以偶尔会发现它不能像它应该的那样缩短,但它通常都有效。