Массив не равен, но это на самом деле? - PullRequest
0 голосов
/ 06 марта 2019

Это так безумно. Я сравниваю два массива пользовательского типа, но он говорит, что это не равно, но на самом деле это так, потому что я напечатал все объекты в нем и проверил их с помощью https://www.diffchecker.com, если они разные, а они нет! Я использую Swift 4.2

func deleteFavorite(_ favorite: Favorite) {
var oldFavorites = getFavoriteSurahs()

oldFavorites.forEach {
    $0.reciter.surahs.forEach {
        print($0.name)
        print($0.number)
    }
    print()

    favorite.reciter.surahs.forEach {
        print($0.name)
        print($0.number)
    }

    print(NSArray(array:
        $0.reciter.surahs).isEqual(favorite.reciter.surahs))
    // It prints false BUT IT SHOULD PRINT TRUE, BECAUSE THEY'RE ACTUALLY EQUAL
}
}

Вот мой класс суры:

class Surah: NSObject, NSCoding {
private(set) public var name: String
private(set) public var number: Int

init(number: Int, name: String) {
    self.number = number
    self.name = name
}

func encode(with aCoder: NSCoder) {
    aCoder.encode(self.name, forKey: "name")
    aCoder.encode(self.number, forKey: "number")
}

required init?(coder aDecoder: NSCoder) {
    self.name = aDecoder.decodeObject(forKey: "name") as! String
    self.number = aDecoder.decodeInteger(forKey: "number")
}
}

А это моя getFavoriteSurahs() функция:

func getFavoriteSurahs() -> [Favorite] {
    if let favoritesData = self.object(forKey: UD_FAVORITES) as? Data {
        do {
            let favorites = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(favoritesData) as! [Favorite]
            return favorites
        } catch {
            debugPrint(error)
            return [Favorite]()
        }
    } else {
        print("EMPTY Favorites")
        return [Favorite]()
    }
}

UPDATE Это так, свалка:

        print($0.surah.number == favorite.surah.number)
        print($0.surah.name == favorite.surah.name)
// Prints true

        print($0.surah == favorite.surah)
// Prints false

ОБНОВЛЕНИЕ 2

if $0.reciter.name == favorite.reciter.name && $0.reciter.image == favorite.reciter.image && $0.reciter.documentID == favorite.reciter.documentID &&
            $0.reciter.surahs.count == favorite.reciter.surahs.count &&

            $0.surah.number == favorite.surah.number &&
            $0.surah.name == favorite.surah.name {
            print("OMG FINALLY")
        } else {
            print("NOO NOO NOO")
        }

// ПЕЧАТЬ ОМГ НАКОНЕЧНО После проверки каждого элемента. Это нормально ??

Ответы [ 3 ]

2 голосов
/ 06 марта 2019

Вы создаете подкласс NSObject, который реализует протокол Equatable, но по умолчанию использует только равенство указателей.Вам необходимо переопределить метод isEqual(_:) и свойство hash:

override func isEqual(_ object: Any?) -> Bool {
    guard let rhs = object as? Surah else { return false }
    return number == rhs.number && name == rhs.name
}

override var hash: Int {
    return number.hashValue ^ name.hashValue
}
let s1 = Surah(number: 1, name: "One")
let s2 = Surah(number: 1, name: "One")
s1 == s2       // => true
[s1] == [s2]   // => true
0 голосов
/ 06 марта 2019

Если вы используете isEqual NSArray для пользовательских объектов (не из SDK), то вам нужно реализовать isEqual для этого типа объектов.Примерно так:

override func isEqual(object: AnyObject?) -> Bool {
        if let object = object as? MyClass {
       // check for every ivar that should be equal
            return foo == object.foo && bar == object.bar
        } else {
            return false
        }
    }
0 голосов
/ 06 марта 2019

NSArray является ссылочным типом, поэтому вы проверяете, равны ли два указателя NSArray. Вы должны использовать собственный тип Swift Array, который делает то, что вы ищете.

...