Двоичный оператор '==' не может быть применен к двум '[AnyHashable:Any]!' операнды

Я собираюсь сравнить 2 словаря таким образом:

var previouldObj:[AnyHashable:Any]!
var obj:[AnyHashable:Any]!
for i in 0..<self.arrayData.count
{

     obj=self.arrayData[i] as! [AnyHashable:Any]
     if(obj == previouldObj)
     {

     }
}

Но я получаю эту ошибку

Двоичный оператор '==' не может быть применен к двум '[AnyHashable:Any]!' операнды

Как это решить? Пожалуйста, помогите мне Спасибо


person user1960169    schedule 20.06.2017    source источник
comment
Попробуйте это stackoverflow. ком/вопросы/32365654/   -  person Umair Afzal    schedule 20.06.2017
comment
@UmairAfzal Я пробовал это, но куда поместить удобство init (словарь otherDictionary: [AnyHashable: Any])?   -  person user1960169    schedule 20.06.2017
comment
почему бы не использовать метод isEqualToDictionary()?   -  person Umair Afzal    schedule 20.06.2017
comment
Этот метод даже не появляется при вводе @UmairAfzal   -  person user1960169    schedule 20.06.2017
comment
public func ==(lhs: [String: AnyObject], rhs: [String: AnyObject] ) -> Bool { return NSDictionary(dictionary: lhs).isEqualToDictionary(rhs) } выдает мне различные ошибки   -  person user1960169    schedule 20.06.2017
comment
сравнение двух значений Any практически невозможно. Вы должны понизить значения до чего-то более специализированного, скорее всего, у вас есть представление о том, что представляет собой Any в вашем словаре.   -  person user3441734    schedule 20.06.2017
comment
@UmairAfzal решение там работает, но НЕ всегда. Если значение, которое было сохранено как Any в словаре, имеет тип, который не соответствует протоколу AnyObject или не может соединяться с таким типом, сравнение двух NSDictionaries вернет false, даже если существуют идентичные копии одного и того же словаря. Это может быть очень сложно отладить...   -  person user3441734    schedule 20.06.2017
comment
@user3441734 user3441734 есть ли какое-нибудь известное вам решение для сравнения этих вещей. Как насчет типов [String:Any]?   -  person user1960169    schedule 20.06.2017
comment
@user1960169 user1960169 для проверки равенства двух значений значения должны иметь один и тот же тип, соответствующий протоколу Equatable.   -  person user3441734    schedule 20.06.2017
comment
Давайте продолжим обсуждение в чате.   -  person user1960169    schedule 20.06.2017


Ответы (1)


Один из способов сделать это — преобразовать previouldObj в NSDictionary и вызвать isEqual.

    var previouldObj:[AnyHashable:Any]!
    var nsDict = NSDictionary(dictionary: previouldObj)
    var obj:[AnyHashable:Any]!
    for i in 0..<self.arrayData.count
    {

        obj=self.arrayData[i] as! [AnyHashable:Any]
        if(nsDict.isEqual(to: obj))
        {

        }
person Sweeper    schedule 20.06.2017
comment
if(nsDict.isEqual(to: obj)==false) {}, но это всегда возвращает false. это почему. В моем массиве так много одинаковых словарей. Я пытаюсь избежать дублирования, проверяя это условие. Но я не могу этого добиться - person user1960169; 20.06.2017