在 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")