【问题标题】:Cast from '[Any]?' to unrelated type '[String : String?]' always fails issue来自“[任何]?”的演员表到不相关的类型 '[String : String?]' 总是失败的问题
【发布时间】:2018-09-20 20:39:03
【问题描述】:

我使用此代码通过 UserDefaults 存储应用设置:

var appSettings: [String: String?] {

    set { // On attempt to set new value for the dictionary
        UserDefaults.standard.set(newValue, forKey: "AppSettings")
        UserDefaults.standard.synchronize()
    }
    get { // On attempt to get something from dictionary
        if let settings = UserDefaults.standard.array(forKey: "AppSettings") as? [String: String?] {
            return settings
        } else {
            return [:]
        }
    }}

但是if let settings = UserDefaults.standard.array(forKey: "AppSettings") as? [String: String?] 行会导致警告:

从 '[Any]?' 投射到不相关的类型 '[String : String?]' 总是失败

任何想法如何在 UerDefaults 中保存这本字典?

【问题讨论】:

  • 为什么字典的值是可选字符串?您通常会省略密钥,因此在访问该密钥时会返回 nil,因此您将使用 [String:String]
  • UserDefaults 广泛基于 Objective-C。在 ObjC 字典中,nil 值无论如何都不支持。
  • 知道了,谢谢:)

标签: ios swift nsuserdefaults


【解决方案1】:

替换这个

UserDefaults.standard.array(forKey: "AppSettings") as? [String: String?]

UserDefaults.standard.dictionary(forKey: "AppSettings") as? [String: String?]

当您存储字典时,请不要使用返回 [Any]?.array(forKey 肯定不能转换为 [String:String?]


同样来自Docs

同步()

等待对默认数据库的任何挂起的异步更新并返回;这种方法是不必要的,不应该使用。

所以评论

UserDefaults.standard.synchronize()

【讨论】:

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