Ios 访问保存在Swift会话中的词典索引

Ios 访问保存在Swift会话中的词典索引,ios,swift,session-variables,swift-dictionary,Ios,Swift,Session Variables,Swift Dictionary,因此,我的应用程序上基本上有一个登录屏幕,成功登录后,在进入主屏幕之前,我会在会话中将以下信息保存在字典中。它是这样的(以静态信息为例): let preferences=UserDefaults.standard 让会话_info:[字符串:字符串]=[ “用户id”:“123”, “姓名”:“约翰”, “电子邮件”:john@doe.com" ] 参数设置(会话信息,forKey:“会话”) preferences.synchronize() 因此,会话数据被保存,如果我将其分配给一个变量

因此,我的应用程序上基本上有一个登录屏幕,成功登录后,在进入主屏幕之前,我会在会话中将以下信息保存在字典中。它是这样的(以静态信息为例):

let preferences=UserDefaults.standard
让会话_info:[字符串:字符串]=[
“用户id”:“123”,
“姓名”:“约翰”,
“电子邮件”:john@doe.com"
]
参数设置(会话信息,forKey:“会话”)
preferences.synchronize()
因此,会话数据被保存,如果我将其分配给一个变量并打印它,我会在控制台中获得一个可选的信息字典

let session\u data=preferences.value(forKey:“session”)!
如果我进行
打印(会话\u数据)
我会得到以下输出:

{
“用户id”=“123”;
“姓名”=“约翰”;
“电子邮件”=”john@doe.com";
}
我的问题是,我不确定如何访问键,因为如果我将分配的变量视为字典,它会说
Type'Any'没有下标成员。
我使用的是:

打印(会话数据[“用户id”])

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

您必须将其作为
字典进行解析

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

它应该可以工作。

您必须将其解析为
字典

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

它应该可以工作。

基本上不要将
值(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")


基本上不要将
值(forKey
UserDefaults
一起使用

默认情况下,有一个专用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")


只需对代码进行一点注释,就不应在
UserDefaults
上调用
synchronize()
。如文档中所述,“此方法是不必要的,不应使用”.但从我阅读的内容来看,手机会不时地执行此操作,我需要确保信息得到保存。或者我读错了吗?只是对代码的一点小评论,您不应该在
UserDefaults
上调用
synchronize()
。正如文档中所述,“此方法是不必要的,不应该使用。”.但从我的阅读来看,手机会时不时地这样做,我需要确保信息得到保存。还是我读错了?(1)你应该使用
字典
,而不是
NSDictionary
(2)强制展开
值(forKey:)
的结果是个坏主意,因为如果默认值不包含该键的条目,它会崩溃。(3)瓦迪安建议使用
默认值
方法
字典(forKey:)
比使用条件转换更干净。(1)应该使用
字典,而不是
NSDictionary
(2)强制展开
值的结果(forKey:)
是个坏主意,因为如果默认值不包含该键的条目,它将崩溃。(3)vadian建议使用
Defaults
方法
字典(forKey:)
比使用条件转换更干净。谢谢,这对我来说非常好。因此,基本上我必须将字典重新编译为我使用的原始结构,以便能够使用它?这取决于您的需要。struct方法只是一种替代方法。它的好处是您不用处理键和转换类型。谢谢,that对我来说是完美的。所以基本上我必须按照我使用的原始结构对字典进行重铸才能使用它?这取决于你的需要。struct方法只是一种替代方法。它的好处是你不用处理键和强制类型。