首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:按项目类型对[Any]的数组进行排序

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

Stack Overflow用户
提问于 2018-12-12 03:40:23
回答 2查看 856关注 0票数 1

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

代码语言:javascript
复制
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个)。

EN

回答 2

Stack Overflow用户

发布于 2018-12-12 03:48:09

这几乎肯定是一个可怕的想法,并且几乎可以肯定掩盖了一个主要的类型错误,但实现起来并不困难。正如您所说的,您将按类型进行排序。因为类型不能直接比较,所以可以按它们的名称排序。

代码语言:javascript
复制
anyObjectArray.sorted { "\(type(of: $0))" < "\(type(of: $1))" }

但这让人深深地感觉到,Array一开始就是错误的类型。感觉你真的很想要一本字典。

票数 1
EN

Stack Overflow用户

发布于 2018-12-12 04:22:21

这不会对数组进行排序,但会在字典中按类型对元素进行分组

代码语言:javascript
复制
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 (或更高版本)

代码语言:javascript
复制
let map = Dictionary(grouping: anyObjectArray, by: { "\(type(of: $0))" })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53731227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档