对具有可选值的对象数组进行排序
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
我正在尝试通过属性 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