在 UserDefaults 中访问字典时类型 'Any' 没有下标成员
Type 'Any' has no subscript members when accessing dictionary in UserDefaults
我正在尝试访问我传递给 UserDefaults
的字典的值,但是我收到此错误:
Type 'Any' has no subscript members.
我在 Whosebug 上四处寻找答案,但我尝试的一切都失败了。
这是我存储在 UserDefaults 中的字典对象,我正在尝试访问 Authorities.levelAcess
:
{
accountEnabled = 0;
accountLocked = 0;
Authorities = {
levelAccess = "tier2";
accessType = "3rd party";
};
message = "Logged in Successfully";
profile = "trust";
roles = (
{
authority = "admin";
}
);
status = 1;
}
这是 UserDefaults 的代码:
let keyDict: Dictionary<String, AnyObject> = json
UserDefaults.standard.set(json, forKey: "dict")
这就是我尝试访问词典的方式:
在代码中显示此错误的原因是:编译器无法将result
识别为字典,如果您尝试选项 然后点击 result
你会看到它的类型是 Any
。您必须先将其转换为 [String: AnyObject]
,然后再将其转换为 "Authorities"。
应该是这样的:
if let result = UserDefaults.standard.dictionary(forKey: "dict") {
print(result)
}
这就是你应该 "optional binding" 字典的方式,因此(假设 "Authorities" 是 [String: String]
):
if let addresses = result["Authorities"] as? [String: String] {
print(addresses)
}
您也可以一步完成:
if let result = UserDefaults.standard.dictionary(forKey: "dict"),
let addresses = result["Authorities"] as? [String: String] {
print(result)
print(addresses)
let levelAccess = addresses["levelAccess"]
print(levelAccess) // optional
}
最后,您可以从 addresses
中获取 levelAcess
作为:
let levelAccess = addresses["levelAccess"]
再次注意,levelAccess
将是一个 optional
字符串 (String?
),这意味着您也应该处理它。
要从 UserDefaults 中获取字典,请使用
dictionary(forKey: key)
你的情况:
var result = UserDefaults.standard.dictionary(forKey: "dict")
我正在尝试访问我传递给 UserDefaults
的字典的值,但是我收到此错误:
Type 'Any' has no subscript members.
我在 Whosebug 上四处寻找答案,但我尝试的一切都失败了。
这是我存储在 UserDefaults 中的字典对象,我正在尝试访问 Authorities.levelAcess
:
{
accountEnabled = 0;
accountLocked = 0;
Authorities = {
levelAccess = "tier2";
accessType = "3rd party";
};
message = "Logged in Successfully";
profile = "trust";
roles = (
{
authority = "admin";
}
);
status = 1;
}
这是 UserDefaults 的代码:
let keyDict: Dictionary<String, AnyObject> = json
UserDefaults.standard.set(json, forKey: "dict")
这就是我尝试访问词典的方式:
在代码中显示此错误的原因是:编译器无法将result
识别为字典,如果您尝试选项 然后点击 result
你会看到它的类型是 Any
。您必须先将其转换为 [String: AnyObject]
,然后再将其转换为 "Authorities"。
应该是这样的:
if let result = UserDefaults.standard.dictionary(forKey: "dict") {
print(result)
}
这就是你应该 "optional binding" 字典的方式,因此(假设 "Authorities" 是 [String: String]
):
if let addresses = result["Authorities"] as? [String: String] {
print(addresses)
}
您也可以一步完成:
if let result = UserDefaults.standard.dictionary(forKey: "dict"),
let addresses = result["Authorities"] as? [String: String] {
print(result)
print(addresses)
let levelAccess = addresses["levelAccess"]
print(levelAccess) // optional
}
最后,您可以从 addresses
中获取 levelAcess
作为:
let levelAccess = addresses["levelAccess"]
再次注意,levelAccess
将是一个 optional
字符串 (String?
),这意味着您也应该处理它。
要从 UserDefaults 中获取字典,请使用
dictionary(forKey: key)
你的情况:
var result = UserDefaults.standard.dictionary(forKey: "dict")