【问题标题】:Swift sort array of objects based on boolean value基于布尔值的快速排序对象数组
【发布时间】:2025-12-27 05:00:12
【问题描述】:

我正在寻找一种基于布尔值对 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
})

【问题讨论】:

  • 重新。在问题中更新,将布尔值与true 进行比较是不必要的混乱,最好在Swift 风格中省略闭包周围的()(当闭包是最后一个参数时是允许的)。

标签: arrays sorting swift


【解决方案1】:

Swift 的数组可以用sort 排序,也可以用sorted 排序到一个新数组。任何一个函数的单个参数都是一个带有两个元素的闭包,如果第一个在第二个之前排序,则返回true。使用闭包参数的最短方法是将它们称为$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 中解决了这个问题。我已经用答案更新了我的问题。
  • 请注意,在 Swift 3.0 中使用了 .sort
【解决方案2】:

新功能(适用于 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 的文档

【讨论】:

  • 这给了我一个错误:无法使用类型参数列表调用“排序”。
【解决方案3】:

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

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

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

【讨论】:

  • 这不能回答问题 - OP 需要按无法使用 > 或