2016-09-19 7 views
2

В Swift 3.0 У меня возникает странная ошибка, когда я пытаюсь сравнить два элемента, которые имеют тип [[String: AnyObject]] и [[String: AnyObject]]!. Таким образом, один из них - это сила, развернутая, а другая - нет.Бинарный оператор Swift 3.0 '==' не может быть применен

Так что сравнение выглядит следующим образом:

let smth: [[String: AnyObject]] = [["key": "Value"]] 
let smth2: [[String: AnyObject]]? = someFunctionThatReturnsAnOptionalArrayOfDictionaries() 

if smth == smth2! { 
    print("Equal") 
} 

Ошибка говорит: Binary operator '==' cannot be applied to operands of type '[[String : AnyObject]]' and '[[String : AnyObject]]!'

Что такое правильный способ сделать это в Swift 3?

+0

Можете указать странную ошибку? –

+0

Добавлено, извините за это. – Majster

+0

Какой Xcode вы используете? –

ответ

4

Это немного сложно, поскольку вы не можете напрямую сравнивать массивы или словари (без перегрузок операторов).

Еще одна проблема, вы можете столкнуться не является обязательным и неопциональные сравнения, который был удален в Swift 3 (только для < и >, == и != до сих пор работают!):

Swift Evolution - Proposal #0121

Что я сделал, чтобы заставить его работать, сначала разворачиваем опцию с помощью if let, тогда я сравнил их с elementsEqual, сначала массив, затем словарь.

let smth: [[String: AnyObject]] = [["key": "Value" as AnyObject]] 
let smth2: [[String: AnyObject]]? = nil 

if let smth2 = smth2, smth.elementsEqual(smth2, by: { (obj1, obj2) -> Bool in 
    return obj1.elementsEqual(obj2) { (elt1, elt2) -> Bool in 
     return elt1.key == elt2.key && elt1.value === elt2.value 
    } 

}) { 
    print("Equal") 
} 

Еще одна проблема, так как вы используете AnyObject в качестве значения, вы не можете сравнить их непосредственно. Вот почему я использовал ===, который проверяет, совпадает ли ссылка сравнения объектов. Не уверен, что это то, что вы хотели.

+3

Ничего себе .. просто ничего себе. Это вводит краху кода для чего-то столь же простого, как сравнение двух объектов JSON, преобразованных в быстрые объекты. Но я думаю, у меня нет выбора. – Majster

+0

Точно. Может быть, вам было бы проще сравнивать JSON Strings? –

+0

Nah, все преобразуется, как только я получаю ответ от API, и это некоторая логика в одном из контроллеров. Сериализация его обратно в строки JSON будет просто растрачивать производительность повсюду. – Majster

2

This SO ответ включает решение этой проблемы под заголовком «Xcode 8 beta 6 • Swift 3».

Примечание, в частности:

В примере выше всех словарных ключей и значений того же типа. Если мы попытаемся сравнить два словаря типа [String: Any], Xcode будет жаловаться, что двоичный оператор == не может быть применен к двум операндам [String: Any]. ... Но мы можем расширить функциональность оператора ==, используя инициализатор NSDictionary:

+0

Wow .. how lame :) Каков наилучший способ сделать это сейчас? Я использую типы '[[String: AnyObject]]' для массивов объектов JSON, возвращаемых из API. Объекты всегда имеют либо строку, либо число, либо нечто подобное в качестве значения. Есть идеи? – Majster

+0

Как насчет [другого ответа] (http://stackoverflow.com/a/32365828/2466193) на тот же вопрос, I.e. Использовать NSObject вместо AnyObject? –

Смежные вопросы