[英]How to use multiple key for the same value in an Swift Dictionary?
如何将用户记录存储到Swift Dictionary
,但通过两种类型的键对其进行索引: userID
和firstName
? 可能吗?
如果删除了一个值,则表达式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"] = nil
, key2
的值仍然存在并且将为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.