Swift 4 Key Value Dictionary хранится в пользовательских настройках по умолчанию - PullRequest
0 голосов
/ 08 сентября 2018

Я новичок в Swift и у меня есть требование хранить базу данных пар ключ-значение. Пары ключ-значение - это имя с соответствующим четырехзначным номером в базе данных, которое остается в памяти после активации приложения. Я думаю использовать словарь с именем в качестве ключа и 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 голосов
/ 08 сентября 2018

Есть большая ошибка. Вы сохраняете словарь, но получаете массив.

Кроме того, словарь, извлеченный из 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.

...