正如其他人已经说过的,我们需要了解哪些是关键。
但是,我试图为我对您问题的解释提供一个解决方案。
struct User {
let id: String
let firstName: String
let lastName: String
}
这里我假设不能存在 2 个具有相同 id 的用户
let users: [User] = ...
let dict = users.reduce([String:User]()) { (result, user) -> [String:User] in
var result = result
result[user.id] = user
return result
}
现在dict 是一个字典,其中key 是user id,value 是user value。
要通过id 访问用户,您现在只需编写
let user = dict["123"]
更新 #1:一般方法
给定一个给定类型Element 的数组,以及一个确定Element 的key 的闭包,以下泛型函数将生成Dictionary 类型的[Key:Element]
func createIndex<Key, Element>(elms:[Element], extractKey:(Element) -> Key) -> [Key:Element] where Key : Hashable {
return elms.reduce([Key:Element]()) { (dict, elm) -> [Key:Element] in
var dict = dict
dict[extractKey(elm)] = elm
return dict
}
}
例子
let users: [User] = [
User(id: "a0", firstName: "a1", lastName: "a2"),
User(id: "b0", firstName: "b1", lastName: "b2"),
User(id: "c0", firstName: "c1", lastName: "c2")
]
let dict = createIndex(elms: users) { $0.id }
// ["b0": {id "b0", firstName "b1", lastName "b2"}, "c0": {id "c0", firstName "c1", lastName "c2"}, "a0": {id "a0", firstName "a1", lastName "a2"}]
更新 #2
正如 Martin R 所述,reduce 将为相关闭包的每次迭代创建一个新字典。这可能会导致大量内存消耗。
这是 createIndex 函数的另一个版本,其中空间要求为 O(n),其中 n 是榆树的长度。
func createIndex<Key, Element>(elms:[Element], extractKey:(Element) -> Key) -> [Key:Element] where Key : Hashable {
var dict = [Key:Element]()
for elm in elms {
dict[extractKey(elm)] = elm
}
return dict
}