ios - 访问保存在 Swift 会话中的字典索引
问题描述
所以我基本上在我的应用程序上有一个登录屏幕,在成功登录后,在对主屏幕执行 segue 之前,我将以下信息保存在会话中的字典中。是这样的(以静态信息为例):
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"])
有没有办法访问这些信息,还是我必须将每个变量保存到单独的会话密钥中?
解决方案
基本上从不使用value(forKey
with UserDefaults
。
有一个默认dictionary(forKey
返回的专用 API。[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) }
推荐阅读
- c# - 获取 ntlm 令牌(www-authenticate - 标头)
- php - 使用 CallbackFilter 搜索多个子模型字段时,类没有名为 user.email 的字段或关联
- react-native - expo build:ios 时 Unicode 规范化不适用于 ASCII-8BIT
- unity3d - 使用 Jenkins Xcode 插件构建项目时出现异常
- c++ - 将 .pb 转换为 ff-lite 时不了解平均值和标准差值
- c++ - 连续光线投射之间的时间延迟
- flask - 如何在启动时在烧瓶外壳中设置 current_user
- java - 为 runForMultipleInputsOutputs 分配内存时出现 Java TFLITE 错误
- c# - Apache.NMS.NetCore 和 Apache.NMS 中都存在“IConnectionFactory”类型
- android - 无法在 android 上使用 firebase ml 套件检测 QR 码,但可以在 ios 上使用(颤振)