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

时间:2018-09-08 06:08:15

标签: ios swift4 nsdictionary nsuserdefaults

我是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")
}

1 个答案:

答案 0 :(得分: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中强烈建议使用参数标签,以提高可读性。