在数组之间匹配和合并信息Swift

时间:2019-05-05 00:49:33

标签: 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)
           }
       }

有没有更有效的方法?我了解了zipmap函数,但不确定如何在我的情况下应用它们。

1 个答案:

答案 0 :(得分:0)

通过属性查找对象的有效方法是从以属性为键的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
}