存储在用户默认值中的Swift 4键值字典

问题描述 投票:0回答:1

我是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")
}
ios swift4 nsdictionary nsuserdefaults
1个回答
1
投票

有一个重大错误。您保存字典但检索数组。

除此之外,从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中使用参数标签。

© www.soinside.com 2019 - 2024. All rights reserved.