我从服务器获取具有以下属性的联系人列表:
从设备上,我获取联系人的个人资料照片(服务器没有照片),这将导致对象具有以下信息:
我的目标是将所有信息合并为一个列表。每个对象都应该像这样:
现在,它可以工作,并且代码如下:
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
函数,但不确定如何在我的情况下应用它们。
答案 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
}