我正在使用存储在dictionray中的数组进行快速访问。因为我需要不同数据类型的逻辑,所以我喜欢将其定义为模板,但我不知道如何传递类型。在我自己的描述中应该是这样的:
struct KeyList {
let key : MyType1
var list = [MyType2]()
init(key : MyType1, value : MyType2) {
self.key = key
self.list.append(value)
}
}
var dicList = [String: KeyList]()
value = ...of MyType2
key = ... of MyType1
if dicList[key] == nil {
// new entry
dicList[key] = KeyList(key: key, value: value)
}
else {
// add it to existing list
dicList[key]!.list.append(value)
}
}
但我想用斯威夫特3。知道吗,如果可能的话?
最佳答案
你需要一些东西:
泛型
封装
片段
这里有一个例子
struct Container<Key, Value> where Key: Hashable {
private var dict: [Key:[Value]] = [:]
func list(by key: Key) -> [Value]? {
return dict[key]
}
mutating func add(value: Value, to key: Key) {
dict[key] = (dict[key] ?? []) + [value]
}
}
用法
现在您可以创建一个
Container
来指定Key
和Value
类型var container = Container<String, Int>()
container.add(value: 1, to: "a")
container.add(value: 2, to: "a")
container.list(by: "a") // [1, 2]
更新
您在评论中询问了如何实现删除功能。在这种情况下,该值需要
Equatable
。这是密码struct Container<Key, Value> where Key: Hashable, Value: Equatable {
private var dict: [Key:[Value]] = [:]
func list(by key: Key) -> [Value]? {
return dict[key]
}
mutating func add(value: Value, to key: Key) {
dict[key] = (dict[key] ?? []) + [value]
}
mutating func remove(value: Value, from key: Key) {
guard var list = dict[key] else { return }
guard let index = list.index(of: value) else { return }
list.remove(at: index)
dict[key] = list
}
}
关于arrays - 在字典中列出作为模板定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40193174/