ios - 数组不相等,但实际上是?
问题描述
这太疯狂了。我正在比较两个自定义类型的数组,但它说它不相等,但实际上是,因为我打印了其中的所有对象并检查它们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]()
}
}
更新这是如此转储:
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")
}
// 最终打印 OMG。在检查了每一项之后。这正常吗??
解决方案
您是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
推荐阅读
- java - Spring Data JPA 本机查询不遵循投影的命名约定
- python - 仅将 Django 应用程序迁移到备用数据库
- emacs - 以编程方式确定 Emacs 是否支持 X11
- angular - 带有动态/更新参数的 Angular 7 自定义验证
- unit-testing - 具有特定构造函数的 JMockit @Tested 字段
- sql - 将两列相乘并在新列 PostreSQL 中显示结果
- python - Python:如何通过对相邻单元求和来重塑数据框?
- python - 在 Django @schema(AutoSchema(manual_fields=
- java - 无法在 Docker 中访问 Maven 依赖项
- javascript - Electron,将文件复制到 websrver 文件夹