对具有可选值的对象数组进行排序

Sorting arrays of object that have optional value

我正在尝试通过属性 currentPeriod 对自定义结构的数组进行排序,此属性取决于名为 scoreboard 的可选类型,这就是我尝试排序的方式:

var newValue = value.sorted(by: {[=10=].scoreboard?.currentPeriod > .scoreboard?.currentPeriod})

但是给了我错误,因为你不能比较可选值,给定一个 LSGame 数组,我如何对其进行排序,以使没有记分牌的元素最终出现在数组中?例如,基于 currentPeriod 的游戏列表应该如下所示:9,7,4,1,nil,nil

这是结构

public struct LSGame: Codable {
    public var scoreboard: LSScoreboard?
}

public struct LSScoreboard: Codable {
    public var currentPeriod: Int
}

你可以试试这个:

if let scoreboard = scoreboard {
      var newValue = value.sorted(by: {[=10=].scoreboard?.currentPeriod > .scoreboard?.currentPeriod})

}

你可以这样做 -

let values: [LSGame] = [
            LSGame(scoreboard: nil),
            LSGame(scoreboard: LSScoreboard(currentPeriod: 9)),
            LSGame(scoreboard: nil),
            LSGame(scoreboard: LSScoreboard(currentPeriod: 1)),
            LSGame(scoreboard: LSScoreboard(currentPeriod: 7)),
            LSGame(scoreboard: LSScoreboard(currentPeriod: 4)),
        ]

var sorted = values.sorted(by: { ([=10=].scoreboard?.currentPeriod ?? 0) > (.scoreboard?.currentPeriod ?? 0) })

输出-

(lldb) po sorted
▿ 6 elements
  ▿ 0 : LSGame
    ▿ scoreboard : Optional<LSScoreboard>
      ▿ some : LSScoreboard
        - currentPeriod : 9
  ▿ 1 : LSGame
    ▿ scoreboard : Optional<LSScoreboard>
      ▿ some : LSScoreboard
        - currentPeriod : 7
  ▿ 2 : LSGame
    ▿ scoreboard : Optional<LSScoreboard>
      ▿ some : LSScoreboard
        - currentPeriod : 4
  ▿ 3 : LSGame
    ▿ scoreboard : Optional<LSScoreboard>
      ▿ some : LSScoreboard
        - currentPeriod : 1
  ▿ 4 : LSGame
    - scoreboard : nil
  ▿ 5 : LSGame
    - scoreboard : nil