arrays - Swift 数组之间的匹配和合并信息
问题描述
我从服务器获取具有以下属性的联系人列表:
- 电话
- 姓名
- 连接的
从设备上,我得到了联系人的个人资料照片(服务器没有),这会产生一个包含以下信息的对象:
- 电话
- 姓名
- 缩略图
我的目标是创建一个包含所有信息合并的列表。每个对象应该是这样的:
- 电话
- 姓名
- 缩略图
- 连接的
现在,它可以工作了,代码如下所示:
var itemsResult: [Contact] = []
for var item in listFromDevice {
if let itemFromServer = listFromServer.filter({ $0.phone == item.phone }).first {
item.connected = itemFromServer.connected
itemsResult.append(item)
}
}
有没有更有效的方法来做到这一点?我阅读了zip
andmap
功能,但我不确定如何在我的案例中应用它们。
解决方案
通过属性查找对象的有效方法是从以属性为键的字典开始。如果数组顺序对您很重要,那么 Dictionary 中的值可以是数组的索引。
这是一个通用示例:
struct S {
let id : Int
}
let arr : [S] = [S(id:1328), S(id:43), S(id:2)]
首先用必要的字典武装自己:
var d = [Int:Int]()
for pair in arr.enumerated() {
d[pair.element.id] = pair.offset
}
现在通过 id 查找数组是非常有效和直接的:
let idToFind = 43
if let ix = d[idToFind] {
let s = arr[ix]
print(s.id) // 43, we found the right one
}
推荐阅读
- sql-server - Onprem DevOps 服务器 TFS2019 需要为用户配置文件创建报告。特别喜欢的电子邮件报告
- abp - Abp.io 的 Identity Server 可以从 URL 更改租户吗?
- c# - 无法在动态编译的代码中加载 System.ValueTuple
- php - 如何使用池建立 PHP PDO 连接
- azure - 如何使用服务托管标识在 Azure 中使用 Terraform 预配资源
- sql - 从列表中获取未在表列中定义的元素
- java - C# 客户端和 Java 服务器 - 文件上传获取错误数据。(有时)
- java - 插入数据库后preparedstatement停止工作
- java - 如何使用 Java 和 Selenium 运行电子应用程序
- react-native - Openstreetmaps 的 react-native-maps 中的暗模式