将一些旧的 AS3 代码移植到 Swift 我在代码中遇到了一个障碍......在 AS3 中,您可以让数组排序操作返回排序结果索引的数字数组,例如
var indices = columns[0].sort(Array.RETURNINDEXEDARRAY | Array.CASEINSENSITIVE);
如果您为 ...args 参数的 sortOptions 参数指定值 8 或 Array.RETURNINDEXEDARRAY,Flash 将返回索引的排序数字数组,该数组反映排序的结果并且不会修改该数组。( AS3 API )
Swift 4 中是否有任何可用的解决方案可以为我提供排序索引?
您可以枚举数组,按元素对其进行排序并映射元素偏移量:
let array = [1,3,2,5,4]
let sortedIndices = array.enumerated()
.sorted{ $0.element < $1.element }
.map{ $0.offset }
sortedIndices // [0, 2, 1, 4, 3]
如果您愿意,也可以扩展 Collection 并实现您自己的方法,如果您将其元素限制为 Comparable 协议:
extension Collection where Element: Comparable {
func sortedIndices() -> [Int] {
return enumerated()
.sorted{ $0.element < $1.element }
.map{ $0.offset }
}
}
let array = [1,3,2,5,4]
let sortedIndices = array.sortedIndices()
sortedIndices // [0, 2, 1, 4, 3]
另一种选择是添加一个闭包作为参数以允许排序:
extension Collection where Element: Comparable {
func sortedIndices() -> [Int] {
return sortedIndices(by: <)
}
}
extension Collection {
func sortedIndices(by condition: (Element, Element) -> Bool) -> [Int] {
return enumerated()
.sorted{ condition($0.element,$1.element) }
.map{ $0.offset }
}
}
let array = [1,3,2,5,4]
let sortedIndices = array.sortedIndices(by: >)
sortedIndices // [3, 4, 1, 2, 0]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句