我有一个包含不同类型对象的数组。在我的实际代码中,这些是符合相同协议的自定义类型,但该原则也适用于以下代码:
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个元素,有时只有一个,另一方面,不同的类型会比两个更多,所以in循环的数量会更多(可能是4-5个)。
发布于 2018-12-12 03:48:09
这几乎肯定是一个可怕的想法,并且几乎可以肯定掩盖了一个主要的类型错误,但实现起来并不困难。正如您所说的,您将按类型进行排序。因为类型不能直接比较,所以可以按它们的名称排序。
anyObjectArray.sorted { "\(type(of: $0))" < "\(type(of: $1))" }但这让人深深地感觉到,Array一开始就是错误的类型。感觉你真的很想要一本字典。
发布于 2018-12-12 04:22:21
这不会对数组进行排序,但会在字典中按类型对元素进行分组
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))" })https://stackoverflow.com/questions/53731227
复制相似问题