如何在Swift Dictionary中为同一个值使用多个键?

时间:2018-04-02 10:58:32

标签: ios swift dictionary

如何将用户记录存储到Swift Dictionary中,但可以通过两种类型的键对其进行索引:userIDfirstName?有可能吗?

如果删除了某个值,则表达式users[aUserID]user[aFirstName]都应返回nil

2 个答案:

答案 0 :(得分:0)

可以为同一个值设置多个密​​钥,请考虑以下示例:

class Value {
    var name = "John"
}

var dictionary: [String: Value] = [:]

var value1 = Value()

dictionary["key1"] = value1
dictionary["key2"] = value1

value1.name = "Theresa"

dictionary["key1"]?.name // "Theresa"
dictionary["key2"]?.name // "Theresa"

对于问题的第二部分:

  

如果删除了值,表达式用户[aUserID]和用户[aFirstName]都应返回nil。

执行此操作dict["key1"] = nil时,key2的值仍然存在且为value1,因此您可以创建一个自定义subscript来处理在values中找到相同的dictionary

答案 1 :(得分:0)

字典不关心唯一值,它们只关心唯一键。所以你可以在字典中拥有尽可能多的相同值,只要它们的键都不同。

我解决问题的方法是隐藏所有必要的逻辑,以使字典键在包装类中保持同步:

struct User {
    let userId: Int
    let firstName: String
    // more user properties
}

class UserDict {

    private var dict = [String: User]()

    subscript(key: String) -> User? {
        return dict[key]
    }

    subscript(key: Int) -> User? {
        return dict["\(key)"]
    }

    func add(_ user: User) {
        dict[user.firstName] = user
        dict["\(user.userId)"] = user
    }

    func remove(forKey key: String) {
        if let user = dict[key] {
            dict.removeValue(forKey: user.firstName)
            dict.removeValue(forKey: "\(user.userId)")
        }
    }

    func remove(forKey key: Int) {
        remove(forKey: "\(key)")
    }

    var count: Int {
        return dict.count / 2
    }
}