Бинарный оператор '==' нельзя применять к операндам типа Any?' и «Строка» 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({ $0["category_name"] == "Fruits" })
        data[.fashion] = self.json.filter({ $0["category_name"] == "Fashion" })
        data[.gadgets] = self.json.filter({ $0["category_name"] == "Gadgets" })
    }

После этого я получаю такую ​​​​ошибку

Бинарный оператор «==» не может применяться к операндам типа «Any?» и «String».

Подскажите, пожалуйста, как решить эту?


person F.Duh    schedule 06.11.2017    source источник
comment
вы можете попробовать как $0[category_name] как? Строка == Фрукты..   -  person Bapu    schedule 06.11.2017
comment
Если ответ json содержит только значения типа String, вы можете изменить data на использование [String: String] и избавить себя от выполнения этого приведения.   -  person paulvs    schedule 06.11.2017
comment
Swift — это объектно-ориентированный язык. Почему бы вам не использовать пользовательскую структуру или класс?   -  person vadian    schedule 06.11.2017


Ответы (3)


Вы должны безопасно привести значение слева к String, например:

data[.fruits] = self.json.filter({ ($0["category_name"] as? String) == "Fruits" })
person Tamás Sengel    schedule 06.11.2017

Проблема в том, что вы пытаетесь сравнить значения разных типов, а именно Any? и String. Чтобы быстро решить проблему, вы можете попытаться убедить Swift, что ваш Any? на самом деле является строковым значением. Попробуйте заменить $0["category_name"] на ($0["category_name"] as? String), что превратит его в String?. Затем Swift сможет сравнить необязательную строку с заданной строкой категории.

person Kilian    schedule 06.11.2017
comment
Я понимаю. Спасибо. - person F.Duh; 06.11.2017

Свифт 5

Измените следующие коды с

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

to

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

Это исправит ошибку.

person Jerry Chong    schedule 23.07.2019