我有一个包含不同类型对象的数组。在我的实际代码中,这些是符合相同协议的自定义类型,但是该原理也适用于以下代码:
let anyObjectArray: [Any] = [51, "g", "hello", 1, 30111]
var sortedArray: [Any] = []
for item in anyObjectArray where item is Int {
sortedArray.append(item)
}
for item in anyObjectArray where item is String {
sortedArray.append(item)
}
print(sortedArray)
// 51, 1, 30111, "g", "hello"
如您所见,我想按项目类型对数组进行排序。
我想知道在数组上迭代几次是否合适。是否有可能使用.map按项目类型对数组进行排序,如果这样,这样做会更有效吗?
我的实际代码中的数组最多包含4-5个元素,有时只有一个,另一方面,类型会比两个更多,因此for in循环的数量会更多(可能是4个) -5)
答案 0 :(得分:1)
这几乎肯定是一个可怕的想法,并且几乎可以肯定掩盖了一个主要的类型错误,但并不难实现。正如您所说,您将按类型进行排序。由于类型不能直接比较,因此可以按名称进行排序。
anyObjectArray.sorted { "\(type(of: $0))" < "\(type(of: $1))" }
但是,这深深地感觉Array
首先是错误的类型。感觉就像您真的想要这里的字典。
答案 1 :(得分:0)
这不会对数组进行排序,而是按字典中的类型对元素进行分组
var map = [String: [Any]]()
anyObjectArray.forEach( {
let key = "\([type(of: $0))"
if map[key] == nil { map[key] = [] }
map[key]?.append($0)
})
或者由Rob Napier建议使用Swift 4.2(或更高版本)
let map = Dictionary(grouping: anyObjectArray, by: { "\(type(of: $0))" })