我是Swift的新手,需要存储键值对的数据库。键值对是数据库中具有相应4位数字的名称,在应用程序兴奋后仍保留在内存中。我想使用一个字典,名称作为键,4位数字作为值。然后使用用户默认类将它们存储在iPad闪存中。
以下是我目前开发的代码。添加到数据库的代码编译正常,但是由于以下消息(可选类型的值'[Any]?'未打开),检查数据库中匹配项的名称和编号的代码将无法编译;您是不是意味着使用'!'或'?'?)这是因为这行代码(如果让databaseCheck = database [name])。我显然尝试解包但似乎无法动摇错误信息。
任何人都有任何想法导致错误或方法的任何问题?
public func checkDatabaseMatch( _ name: String, _ number: String) -> Bool
{
var foundInDatabaseFlag: Bool = false
let database = UserDefaults.standard.array(forKey: "Database")
if let databaseCheck = database[name]
{
if (databaseCheck == number)
{
foundInDatabaseFlag = true
}
}
return foundInDatabaseFlag
}
public func saveToDatabase( _ name: String, _ number: String)
{
var newEntry: [String: String] = [:]
newEntry[name] = number
UserDefaults.standard.set(newEntry, forKey: "Database")
}
有一个重大错误。您保存字典但检索数组。
除此之外,从UserDefaults
检索的字典默认是[String:Any]
,你必须有条件地向下转换对象。
代码检查UserDefaults
中是否有字典,以及是否在一个表达式中有所请求的密钥
public func checkDatabaseMatch( _ name: String, _ number: String) -> Bool
{
guard let database = UserDefaults.standard.dictionary(forKey: "Database") as? [String:String],
let databaseCheck = database[name] else { return false }
return databaseCheck == number
}
另一个错误是你总是在UserDefaults
覆盖整个字典。如果要保存多个键值对,则必须先读取字典。
public func saveToDatabase( _ name: String, _ number: String)
{
var newEntry : [String: String]
if let database = UserDefaults.standard.dictionary(forKey: "Database") as? [String:String] {
newEntry = database
} else {
newEntry = [:]
}
newEntry[name] = number
UserDefaults.standard.set(newEntry, forKey: "Database")
}
附注:为了更好的可读性,强烈建议在Swift中使用参数标签。