【问题标题】:Type 'Any' has no subscript members when accessing dictionary in UserDefaults在 UserDefaults 中访问字典时,类型“任何”没有下标成员
【发布时间】:2018-04-15 08:23:15
【问题描述】:

我正在尝试访问我传递给UserDefaults 的字典的值,但是我收到了这个错误:

类型“任何”没有下标成员

我在 StackOverflow 上四处寻找答案,但我尝试的一切都失败了。

这是我存储在 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")

这就是我尝试访问字典的方式:

【问题讨论】:

  • 你应该添加代码而不是截图。

标签: swift dictionary nsuserdefaults userdefaults


【解决方案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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多