在字典中列出作为模板定义

时间:2016-10-22 14:16:01

标签: arrays swift templates dictionary

我使用存储在字典中的数组进行快速访问。因为我需要这种逻辑用于不同的数据类型,我喜欢将其定义为模板,但我不知道如何传递类型。在我自己的描述中,它应该是这样的:

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)
        }
    }

但我想使用Swift 3.任何想法,如果可能的话?

1 个答案:

答案 0 :(得分:3)

你需要做一些事情:

  1. 泛型
  2. 封装
  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]
    

    更新

    您在评论中询问如何实施删除功能。在这种情况下,Value必须为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
        }
    
    }
    

    enter image description here