【问题标题】:Value of protocol type 'Any' cannot conform to 'Equatable' Swift协议类型 'Any' 的值不能符合 'Equatable' Swift
【发布时间】:2020-12-04 02:26:43
【问题描述】:

我正在尝试从“libraryArray”中删除“songDict”,但它会触发错误。

var libraryArray = UserDefaults.standard.value(forKey: "LibraryArray") as! [Dictionary<String, Any>]

var songDict = Dictionary<String, Any>()

var arr = libraryArray.filter {$0 != songDict}

这是错误。 协议类型'Any'的值不能符合'Equatable';只有结构/枚举/类类型可以符合协议

【问题讨论】:

  • var songDict: Dictionary&lt;String, Any&gt;() 不会编译。它应该是 var songDict: Dictionary&lt;String, Any&gt;(定义 var 及其类型,但没有 init)或 var songDict = Dictionary&lt;String, Any&gt;()(使用类型和 init 定义 var)
  • 不相关但UserDefaults 中有dictionary(forKey。只有当你知道 KVC 是什么并且你真的需要它时,你才应该使用value(forKey

标签: ios swift userdefaults


【解决方案1】:

正如错误所说,您不能像这样比较两个字典,因为它们不符合Equatable 协议。最好为您的数据模型使用结构而不是Dictionary

struct Library: Equatable {
    let id: String
    ...
}

但如果您不想这样做,您仍然可以通过将其中任何键的值相等来检查字典是否相等。

    var arr = libraryArray.filter { (dict) -> Bool in
        dict["id"] as? String == songDict["id"] as? String
    }

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多