这是一个通用的Swift 5.2解决方案。
首先,我们需要定义一个协议,其中包含一个用于重新排序元素的属性:
protocol Reorderable {
associatedtype OrderElement: Equatable
var orderElement: OrderElement { get }
}
接下来,我们需要扩展 Array
,让其包含符合 Reorderable
接口的元素,并实现我们的重排序函数:
extension Array where Element: Reorderable {
func reorder(by preferredOrder: [Element.OrderElement]) -> [Element] {
sorted {
guard let first = preferredOrder.firstIndex(of: $0.orderElement) else {
return false
}
guard let second = preferredOrder.firstIndex(of: $1.orderElement) else {
return true
}
return first < second
}
}
}
示例
假设您已经定义了:
struct Player {
let position: String
}
let currentPositions = ["RB", "AA", "BB", "CC", "WR", "TE"]
let players = currentPositions.map { Player(position: $0) }
现在,您所需要做的就是将Player
适配为Reorderable
:
extension Player: Reorderable {
typealias OrderElement = String
var orderElement: OrderElement { position }
}
现在您可以使用:
let sortedPlayers = players.reorder(by: ["QB", "WR", "RB", "TE"])
print(sortedPlayers.map { $0.position })
原始解决方案
这是一个通用的Swift 5.2解决方案,基于OuSS的代码,并要求数组元素是可比较的。
extension Array where Element: Equatable {
func reorder(by preferredOrder: [Element]) -> [Element] {
return self.sorted { (a, b) -> Bool in
guard let first = preferredOrder.firstIndex(of: a) else {
return false
}
guard let second = preferredOrder.firstIndex(of: b) else {
return true
}
return first < second
}
}
}
let currentPositions = ["RB", "AA", "BB", "CC", "WR", "TE"]
let preferredOrder = ["QB", "WR", "RB", "TE"]
let sorted = currentPositions.reorder(by: preferredOrder)
print(sorted)
Comparable
。使用该比较方法对玩家进行排序。 - SulthanpositionOrders
是常量还是在运行时会发生变化? - Sulthan