在 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

将字典保存到 UserDefaults

SwiftUI 从 UserDefaults.standard 存储和提取字典

在 UserDefaults 中存储字典

在 UserDefaults 中存储 OpaquePointer 类型

无法从 Userdefaults 访问数据 - Swift