我正在使用存储在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来指定KeyValue类型
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 - 在字典中列出作为模板定义-LMLPHP

关于arrays - 在字典中列出作为模板定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40193174/

10-13 05:34