Доступ к индексу словаря, сохраненному в сеансе Swift - PullRequest
1 голос
/ 17 октября 2019

Таким образом, у меня в основном экран входа в приложение, и после успешного входа в систему, прежде чем перейти к главному экрану, я сохраняю следующую информацию в словаре в сеансе. Это примерно так (поместив статическую информацию для примера):

    let preferences = UserDefaults.standard
    let session_info : [String: String] = [
        "user_id": "123",
        "name": "John",
        "email": "john@doe.com"
    ]
    preferences.set(session_info, forKey: "session")
    preferences.synchronize()

Таким образом, данные сеанса сохраняются, если я назначаю их переменной и печатаю, я получаю дополнительный словарь информации в моей консоли.

    let session_data = preferences.value(forKey: "session")!

Если я сделаю print(session_data), я получу такой вывод:

   {
       "user_id" = "123";
       "name" = "John";
       "email" = "john@doe.com";
   }

Моя проблема в том, что я не уверен, как получить доступ к ключам, потому что, если я лечуназначенная переменная в качестве словаря говорит: Type 'Any' has no subscript members. Что я использую, это:

   print(session_data["user_id"])

Есть ли способ получить доступ к этой информации, или мне нужно сохранить каждую переменную в отдельный сеансовый ключ?

Ответы [ 2 ]

5 голосов
/ 17 октября 2019

В основном никогда не используйте value(forKey с UserDefaults.

. Существует специальный API dictionary(forKey, который возвращает [String:Any]? по умолчанию. В вашем случае условно уменьшите словарь до [String:String].

if let sessionData = preferences.dictionary(forKey: "session") as? [String:String] {
   print(sessionData["user_id"]!)
} else {
   print("sessionData is not available")
}

И это не JavaScript. Назовите переменные lowerCamelCased .


Более сложный способ - использовать структуру и сохранить ее с помощью Codable

struct Session : Codable {
    let userID, name, email : String
}

let preferences = UserDefaults.standard
let sessionInfo = Session(userID:"123", name: "John", email: "john@doe.com")
let sessionData = try! JSONEncoder().encode(sessionInfo)
preferences.set(sessionData, forKey: "session")

do {
    if let sessionData = preferences.data(forKey: "session") {
        let sessionInfo = try JSONDecoder().decode(Session.self, from: sessionData)
        print(sessionInfo.userID)
    }
} catch { print(error) }
0 голосов
/ 17 октября 2019

Вы должны разобрать это как Dictionary.

guard let session_data = preferences.value(forKey: "session")! as? NSDictionary else {return }
print(session_data["user_id"])

Это должно работать.

...