0

我正在尝试使用 NSMutableOrderedSet 来存储一些数据,但我想按特定属性对集合进行排序。我试图在网上查看如何使用 NSMutableOrderedSet 的 sort(comarator cmptr: (Any, Any) -> ComparisonResult) 函数,但我不确定如何使用它。我想知道是否有人可以给我一个快速示例,我无法在 Apple 开发人员文档中找到任何教程或示例。

目前我有:

jersey.swift:

    struct Jersey{
       var name: String
       var number: Int
}

视图控制器.swift:

let firstBasemanJersey = Jersey(name: "Bob", number: 5)
let secondBasemanJersey = Jersey(name: "Jim", number: 15)
let thirdBasemanJersey = Jersey(name: "Jon", number: 1)
let catcherJersey = Jersey(name: "Steve", number: 79)

var jerseySet = NSMutableOrderedSet()
jerseySet.addObject(firstBasemanJersey)
jerseySet.addObject(secondBasemanJersey)
jerseySet.addObject(thirdBasemanJersey)
jerseySet.addObject(catcherJersey)

我想按 jersey.number 对集合进行排序,有人能告诉我如何使用

self.something.sort { (<#Any#>, <#Any#>) -> ComparisonResult in
            <#code#>
        }
4

1 回答 1

0

在最基本的形式中,您只需比较两个参数(一对Any对象,因为 Set 不“知道”当前持有什么对象)并返回 aComparisonResult可以是orderedAscending,orderedDescendingorderedSame:

jerseySet.sort(comparator: { lhs, rhs in
    guard let (l, r) = (lhs, rhs) as? (Jersey, Jersey) else { return .orderedSame }
    guard l.number != r.number else { return .orderedSame }
    return l.number < r.number  ? .orderedAscending : .orderedDescending
}) 

现在如果你print(jerseySet.array)

[Jerseys.Jersey(姓名:“Jon”,号码:1),Jerseys.Jersey(姓名:“Bob”,号码:5),Jerseys.Jersey(姓名:“Jim”,号码:15),Jerseys.Jersey(姓名:“史蒂夫”,编号:79)]

并且(由于问题评论中提到的原因)这里是一个“Swiftier”版本:

struct Jersey: Hashable {
   let name: String
   let number: Int
}

let firstBasemanJersey  = Jersey(name: "Bob", number: 5)
let secondBasemanJersey = Jersey(name: "Jim", number: 15)
let thirdBasemanJersey  = Jersey(name: "Jon", number: 1)
let catcherJersey       = Jersey(name: "Steve", number: 79)

// Kept as var assuming that you will later `.insert` things in the set
var jerseySet = Set([
    firstBasemanJersey,
    secondBasemanJersey,
    thirdBasemanJersey,
    catcherJersey
])

let sortedByNumber = jerseySet.sorted { lhs, rhs in
    lhs.number < rhs.number
}
于 2020-03-07T22:53:29.710 回答