Если ваш completionTime
правильно сформирован (seconds
в 0...59
и milliseconds
в 0...999
), тогда вы можете отсортировать leaderboard
с помощью:
leaderBoard.sort { $0.completionTime < $1.completionTime }
Это работает, потому что Swift может сравнивать 2 кортежа (1, 2, 3)
и (1, 2, 4)
с <
, и он будет сравнивать первые элементы, и если они равны, он будет сравнивать вторые элементы, и если они равныон будет сравнивать третий.Таким образом, вы можете заказать их с простым <
сравнением.Это работает, даже если элементы помечены, если два кортежа имеют одинаковое количество элементов, количество элементов равно 6 или меньше, а типы соответствующих элементов совпадают.
Пример:
var leaderBoard: [(playerName: String, completionTime: (minutes: Int, seconds: Int, milliseconds: Int), totalMoves: Int, dateStamp: Date)] = [
(playerName: "Fred", completionTime: (minutes: 4, seconds: 10, milliseconds: 800), totalMoves: 3, dateStamp: Date()),
(playerName: "Barney", completionTime: (minutes: 5, seconds: 10, milliseconds: 800), totalMoves: 3, dateStamp: Date()),
(playerName: "Wilma", completionTime: (minutes: 4, seconds: 10, milliseconds: 801), totalMoves: 3, dateStamp: Date()),
(playerName: "Bam Bam", completionTime: (minutes: 1, seconds: 10, milliseconds: 0), totalMoves: 3, dateStamp: Date()),
(playerName: "Pebbles", completionTime: (minutes: 4, seconds: 10, milliseconds: 799), totalMoves: 3, dateStamp: Date())
]
leaderBoard.sort { $0.completionTime < $1.completionTime }
leaderBoard.forEach { print($0) }
Выход:
(playerName: "Bam Bam", completionTime: (minutes: 1, seconds: 10, milliseconds: 0), totalMoves: 3, dateStamp: 2018-09-21 11:17:36 +0000)
(playerName: "Pebbles", completionTime: (minutes: 4, seconds: 10, milliseconds: 799), totalMoves: 3, dateStamp: 2018-09-21 11:17:36 +0000)
(playerName: "Fred", completionTime: (minutes: 4, seconds: 10, milliseconds: 800), totalMoves: 3, dateStamp: 2018-09-21 11:17:36 +0000)
(playerName: "Wilma", completionTime: (minutes: 4, seconds: 10, milliseconds: 801), totalMoves: 3, dateStamp: 2018-09-21 11:17:36 +0000)
(playerName: "Barney", completionTime: (minutes: 5, seconds: 10, milliseconds: 800), totalMoves: 3, dateStamp: 2018-09-21 11:17:36 +0000)