Swift:按项目类型对[Any]数组进行排序

时间:2018-12-11 19:40:23

标签: arrays swift sorting types

我有一个包含不同类型对象的数组。在我的实际代码中,这些是符合相同协议的自定义类型,但是该原理也适用于以下代码:

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)

2 个答案:

答案 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))" })