二元运算符“==”不能应用于 'Any?' 和 'String' Swift iOS 类型的操作数

Binary operator '==' cannot be applied to operands of type 'Any?' and 'String' Swift iOS

我有这个 var json : [[String : Any]] = [[:]],其中包含如下 JSON 响应:

{
"id": "1",
"name": "Apple",
"category_name": "Fruits"
},
{
"id": "2",
"name": "Black shirt",
"category_name": "Fashion"
},
{
"id": "3",
"name": "iPad",
"category_name": "Gadgets"
}

我写了一个枚举:

enum : Int {
        case fruits = 0, fashion, gadgets
    }

var data = [Categories: [[String: Any]]]()

然后我有这个方法来分类:

func sortData() {
        data[.fruits] = self.json.filter({ [=16=]["category_name"] == "Fruits" })
        data[.fashion] = self.json.filter({ [=16=]["category_name"] == "Fashion" })
        data[.gadgets] = self.json.filter({ [=16=]["category_name"] == "Gadgets" })
    }

之后我得到这样的错误

Binary operator '==' cannot be applied to operands of type 'Any?' and 'String'

请告诉我如何解决这个问题?

您应该安全地将左侧的值转换为 String,如下所示:

data[.fruits] = self.json.filter({ ([=10=]["category_name"] as? String) == "Fruits" })

问题是您正在尝试比较不同类型的值,即 Any?String。要快速解决问题,您可能需要尝试说服 Swift 您的 Any? 实际上是一个字符串值。尝试将 [=13=]["category_name"] 替换为 ([=14=]["category_name"] as? String),这会将其变成 String?。 Swift 然后将能够将可选字符串与您给定的类别字符串进行比较。

Swift 5

更改

中的以下代码
func sortData() {
        data[.fruits] = self.json.filter({ [=10=]["category_name"] == "Fruits" })
        data[.fashion] = self.json.filter({ [=10=]["category_name"] == "Fashion" })
        data[.gadgets] = self.json.filter({ [=10=]["category_name"] == "Gadgets" })
    }

func sortData() {
        data[.fruits] = self.json.filter({ [=11=]["category_name"] as? String  == "Fruits" })
        data[.fashion] = self.json.filter({ [=11=]["category_name"] as? String == "Fashion" })
        data[.gadgets] = self.json.filter({ [=11=]["category_name"] as? String == "Gadgets" })
    }

这将修复错误。