首页 > 解决方案 > 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)
           }
       }

有没有更有效的方法来做到这一点?我阅读了zipandmap功能,但我不确定如何在我的案例中应用它们。

标签: arraysswift

解决方案


通过属性查找对象的有效方法是从以属性为键的字典开始。如果数组顺序对您很重要,那么 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
}

推荐阅读