将一些旧的AS3代码移植到Swift我在代码中遇到了一个障碍......在AS3中,您可以使用数组排序操作返回排序结果的数字索引数组,例如
var indices = columns[0].sort(Array.RETURNINDEXEDARRAY | Array.CASEINSENSITIVE);
如果指定值为8或Array.RETURNINDEXEDARRAY ... args参数的sortOptions参数,Flash返回一个已排序的 反映排序和结果的索引的数字数组 不修改数组。 (AS3 API)
Swift 4中有哪些解决方案可以为我提供排序索引?
答案 0 :(得分:3)
您可以枚举数组,按其元素对其进行排序,并映射元素offset:
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]
如果您愿意,如果您将其元素约束为Comparable协议,您也可以扩展Collection并实现自己的方法:
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]