繁体   English   中英

如何在Swift字典中对相同的值使用多个键?

[英]How to use multiple key for the same value in an Swift Dictionary?

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

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

对于相同的值, 可以有多个键,请考虑以下示例:

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"

对于问题的第二部分:

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

当您执行dict["key1"] = nilkey2的值仍然存在并且将为value1 ,因此您可以创建一个自定义subscript ,通过在dictionary找到相同的values来处理该subscript

字典不关心唯一值,它们只关心唯一键。 因此,只要它们的键都不同,您就可以在词典中拥有任意多个相同的值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM