Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组之间的匹配和合并信息_Arrays_Swift - Fatal编程技术网

Arrays 数组之间的匹配和合并信息

Arrays 数组之间的匹配和合并信息,arrays,swift,Arrays,Swift,我从服务器获取具有以下属性的联系人列表: 电话 名字 连接的 从设备中,我获得联系人的个人资料照片(服务器没有),这将生成一个包含以下信息的对象: 电话 名字 缩略图 我的目标是有一个合并了所有信息的单一列表。每个对象应如下所示: var itemsResult: [Contact] = [] for var item in listFromDevice { if let itemFromServer = listFromServer.filte

我从服务器获取具有以下属性的联系人列表:

  • 电话
  • 名字
  • 连接的
从设备中,我获得联系人的个人资料照片(服务器没有),这将生成一个包含以下信息的对象:

  • 电话
  • 名字
  • 缩略图
我的目标是有一个合并了所有信息的单一列表。每个对象应如下所示:

   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)
           }
       }
  • 电话
  • 名字
  • 缩略图
  • 连接的
现在,它工作了,代码如下所示:

   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
map
函数,但我不确定如何将它们应用到我的案例中。

通过属性查找对象的有效方法是从属性作为键的字典开始。如果数组顺序对您很重要,则字典中的值可以作为数组的索引

下面是一个普遍的例子:

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
}