我正在尝试根据其属性对结构数组进行排序。
假设我想按x坐标对NSViews
数组进行排序。
我怎么能做到这一点?
答案 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之外,类似于if
或while
等其他块结构;如果闭包表达式是单个语句,则可以跳过return
,并且可以跳过函数签名并使用$0
,$1
等作为参数名称。
最后一个最好只在没有更多有用的名称时使用(例如p1
不比$0
更具描述性)。如果您确实想要给它们命名,您仍然可以跳过以下类型:
let sortedArray = sorted(allViewsArray) { p1, p2 in
p1.frame.origin.x < p2.frame.origin.x
}
当应用这种语法糖时,Swift有时会有点脆弱,所以偶尔会发现它不能像它应该的那样缩短,但它通常都有效。