基于布尔值对Swift对象数组进行排序

78

我正在寻找一种基于布尔值对 Swift 数组进行排序的方法。

使用向 NSArray 强制转换的方式可以实现:

var boolSort = NSSortDescriptor(key: "selected", ascending: false)
var array = NSArray(array: results)
return array.sortedArrayUsingDescriptors([boolSort]) as! [VDLProfile]

但我正在寻找Swift变量,有任何想法吗?

更新 感谢Arkku,我已经使用以下代码修复了这个问题:

return results.sorted({ (leftProfile, rightProfile) -> Bool in
    return leftProfile.selected == true && rightProfile.selected != true
})

1
关于问题的更新,与“true”比较布尔值是不必要的冗余代码,更好的 Swift 风格是省略闭包周围的 ()(当闭包是最后一个参数时允许这样做)。 - Arkku
3个回答

179

使用sortsorted方法,可以对Swift的数组进行排序。这两个方法只有一个参数,该参数是一个闭包,接受两个元素作为输入并返回truefalse,以指示第一个元素是否应该排在第二个元素之前。

使用最简单的方式来定义闭包的参数是使用$0$1

例如(将真布尔值排在前面):

// In-place:
array.sort { $0.selected && !$1.selected }

// To a new array:
array.sorted { $0.selected && !$1.selected }

(编辑:已更新支持Swift 3、4和5,之前的sortsortInPlacesortedsort


谢谢,使用你的回答我已经在Swift中解决了这个问题。我已经更新了我的问题并且附上了答案。 - Antoine
请注意,在Swift 3.0中使用.sort。 - Andrew Ho

4

新特性(适用于Swift 1.2)

return results.sort { $0.selected && !$1.selected }

旧版(适用于Swift 1.0)

假设results的类型为[VDLProfile],而VDLProfile具有一个Bool成员selected

return results.sorted { $0.selected < $1.selected }

请参阅文档 sorted 了解更多信息。


2
这给我一个错误:不能调用'type'类型的参数列表进行排序。 - Antoine

0

Swift标准库提供了一个名为sorted的函数,它可以根据您提供的排序闭包的输出,对已知类型的值数组进行排序。

reversed = sorted(array) { $0 > $1 }

reversed 将是一个新的数组,根据闭包中给定的条件进行排序。


这并没有回答问题 - OP 需要按布尔值排序,而这些值不能使用 > 或 < 进行比较。(另外第一句话是从 Swift 书中逐字复制的) - atultw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接