在 UserDefaults 中访问字典时,类型“任何”没有下标成员
Posted
技术标签:
【中文标题】在 UserDefaults 中访问字典时,类型“任何”没有下标成员【英文标题】:Type 'Any' has no subscript members when accessing dictionary in UserDefaults 【发布时间】:2018-04-15 08:23:15 【问题描述】:我正在尝试访问我传递给UserDefaults
的字典的值,但是我收到了这个错误:
类型“任何”没有下标成员。
我在 *** 上四处寻找答案,但我尝试的一切都失败了。
这是我存储在 UserDefaults 中的 Dictionary 对象,我正在尝试访问 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")
这就是我尝试访问字典的方式:
【问题讨论】:
你应该添加代码而不是截图。 【参考方案1】:在您的代码中显示此错误的原因是:编译器无法将result
识别为字典,如果您尝试选项并单击result
你会看到它的类型是Any
。您必须先将其转换为 [String: AnyObject]
,然后从它获取“Authorities”。
应该是这样的:
if let result = UserDefaults.standard.dictionary(forKey: "dict")
print(result)
这就是你应该“可选绑定”字典的方式,因此(假设“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?
),这意味着您也应该处理它。
【讨论】:
非常好,非常感谢你解释得很好,我很感激 在这种情况下,它应该不是value(forKey
,永远不会。请停止建议这种不恰当的 KVC 方法,除非你能解释为什么你明确需要 KVC。有一个dictionary(forKey
方法
@vadian 感谢您的注意。你能详细说明一下吗? ?
value(forKey
是一种具有特殊功能的方法。此功能有更多开销,从用户默认值获取字典时绝对不需要。 UserDefaults
有许多不同类型的专用方法。
哦,我的错!明白了...已编辑。【参考方案2】:
要从 UserDefaults 中获取字典,请使用
dictionary(forKey: key)
在你的情况下:
var result = UserDefaults.standard.dictionary(forKey: "dict")
【讨论】:
以上是关于在 UserDefaults 中访问字典时,类型“任何”没有下标成员的主要内容,如果未能解决你的问题,请参考以下文章
从 UserDefaults 获得的布尔值打印为 0 或 1,即使保存为 Any
SwiftUI 从 UserDefaults.standard 存储和提取字典