【发布时间】:2015-06-13 20:41:17
【问题描述】:
我正在尝试根据其属性对结构数组进行排序。
假设我想按 x 坐标对 NSViews 的数组进行排序。
我怎样才能做到这一点?
【问题讨论】:
我正在尝试根据其属性对结构数组进行排序。
假设我想按 x 坐标对 NSViews 的数组进行排序。
我怎样才能做到这一点?
【问题讨论】:
这是一个非常漂亮的解决方案,它被称为 Closure Expression Syntax。
你需要做的是:
let sortedArray = sorted(allViewsArray, { (p1: NSView, p2: NSView) -> Bool in
return p1.frame.origin.x < p2.frame.origin.x
})
这会将alLViewsArray从X坐标最大到最小排序,并将其存储在sortedArary中。
【讨论】:
请注意,您可以稍微简化语法,这通常有助于提高可读性(重点是您在做什么,而不是类型的语法等):
let sortedArray = sorted(allViewsArray) {
$0.frame.origin.x < $1.frame.origin.x
}
尾随闭包可以在函数调用括号之外,类似于 if 或 while 等其他块结构;如果闭包表达式是单个语句,则可以跳过 return,并且可以跳过函数签名并使用 $0、$1 等作为参数名称。
只有在没有更多有用的名称时才最好使用最后一个(例如,p1 不比 $0 更具描述性)。如果你确实想给它们起名字,你仍然可以跳过类型:
let sortedArray = sorted(allViewsArray) { p1, p2 in
p1.frame.origin.x < p2.frame.origin.x
}
在应用这种语法糖时,Swift 有时会有点脆弱,所以有时你会发现它不能像应有的那样缩短,但它通常可以工作。
【讨论】: