如何将用户记录存储到Swift Dictionary
中,但可以通过两种类型的键对其进行索引:userID
和firstName
?有可能吗?
如果删除了某个值,则表达式users[aUserID]
和user[aFirstName]
都应返回nil
。
答案 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
}
}