访问保存在Swift会话中的Dictionary索引

Mih*_*kov 1 session-variables ios swift swift-dictionary

所以我基本上在我的应用程序上有一个登录屏幕,成功登录后,在对主屏幕执行segue之前,我将以下信息保存在会话中的Dictionary中。就像这样(在示例中输入静态信息):

    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()
Run Code Online (Sandbox Code Playgroud)

这样就保存了会话数据,如果我将其分配给变量并打印,则可以在控制台中获得可选的信息字典。

    let session_data = preferences.value(forKey: "session")!
Run Code Online (Sandbox Code Playgroud)

如果我这样做,print(session_data)则会得到以下输出:

   {
       "user_id" = "123";
       "name" = "John";
       "email" = "john@doe.com";
   }
Run Code Online (Sandbox Code Playgroud)

我的问题是我不确定如何访问键,因为如果我将分配的变量视为字典,它会说Type 'Any' has no subscript members.我使用的是:

   print(session_data["user_id"])
Run Code Online (Sandbox Code Playgroud)

有没有办法访问此信息,或者我必须将每个变量保存到单独的会话密钥中?

vad*_*ian 5

基本上从不使用value(forKeyUserDefaults

有一个专用的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")
}
Run Code Online (Sandbox Code Playgroud)

这不是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")
Run Code Online (Sandbox Code Playgroud)
do {
    if let sessionData = preferences.data(forKey: "session") {
        let sessionInfo = try JSONDecoder().decode(Session.self, from: sessionData)
        print(sessionInfo.userID)
    }
} catch { print(error) }
Run Code Online (Sandbox Code Playgroud)