由于某些原因,我无法比较两个不同的数组,例如:
if (self.data.contains(where: self.compareData)){
}投掷:
无法将“dataModel”类型的值转换为预期的参数类型(DataModel)抛出-> Bool
使用==对它们进行比较时,也会抛出一个错误作为Binary operator '==' cannot be applied to operands of type '((dataModel) throws -> Bool) throws -> Bool' and '[dataModel]'。
数组被格式化为:
var data : [dataModel] = [dataModel] ()
var compareData : [dataModel] = [dataModel]()我正在检查该数组是否设置为在替换数据和更新表之前发送的相同数组。
编辑:这是dataModels代码:
class dataModel {
var teamName : String = ""
var aboutTeams : String = ""
// var rate : String = "5" // team Rating
var messageID : String = ""
}发布于 2019-11-25 01:47:27
您可以比较dataModel中元素的属性,如果它们本质上是可比较/相等的,比如String或Int。如果您希望能够测试dataModel数组本身中特定元素的相等性,那么您必须使您的dataModel符合相等。
我相信您所面临的问题与使您的dataModel类或结构符合等价性有关,或者与您如何填充数据和compareData有关。
这个基本的例子应该给你一个如何做它的想法。它测试数据的不同部分(越来越小的实体)的相等性:
struct dataModel: Equatable {
let id: Int
let name: String
}
var data : [dataModel] = [dataModel]()
var compareData : [dataModel] = [dataModel]()
data = [
dataModel(id: 5, name: "five"),
dataModel(id: 3, name: "three")
]
compareData = [
dataModel(id: 5, name: "five"),
dataModel(id: 2, name: "three")
]
if data[0].id == compareData[0].id {
print("First item ID is equal")
}
if data[0].name == compareData[0].name {
print("First item name is equal")
}
if data[0] == compareData[0] {
print("First item of both data and compareData are equal")
}
if data == compareData {
print("Data Arrays are equal")
} else {
print("Data Arrays are not equal")
}我看到您刚刚展示了DataModel的代码(类通常应该是大写的),所以下面是一个使用类的实际实现进行定制的示例:
class DataModel: Equatable {
static func == (lhs: DataModel, rhs: DataModel) -> Bool {
guard lhs.aboutTeams == rhs.aboutTeams else {return false}
guard lhs.messageID == rhs.messageID else {return false}
guard lhs.teamName == rhs.teamName else {return false}
return true
}
var teamName : String = ""
var aboutTeams : String = ""
var messageID : String = ""
}
var data : [DataModel] = [DataModel]()
var compareData : [DataModel] = [DataModel]()
data = [
DataModel(),
DataModel()
]
data[0].teamName = "raptors"
data[0].messageID = "5"
compareData = [
DataModel(),
DataModel()
]
compareData[0].teamName = "raptors"
compareData[0].messageID = "4"
if data[0].teamName == compareData[0].teamName {
print("Element 0 team names are equal")
} else {
print("Element 0 team names are not equal")
}
if data[0].messageID == compareData[0].messageID {
print("Elemeant 0 message IDs are equal")
} else {
print("Elemeant 0 message IDs are not equal")
}
if data[1] == compareData[1] {
print("Element 1 of data and compareData are equal")
}
if data == compareData {
print("Arrays are equal")
} else {
print("Arrays are not equal")
}控制台输出是:
Element 0 team names are equal
Elemeant 0 message IDs are not equal
Element 1 of data and compareData are equal
Arrays are not equal希望这能有所帮助!
发布于 2019-11-25 01:35:37
这是因为您试图使用的函数需要一个NSPredicate。
检查数组是否包含另一个数组的子集的一种方法是执行以下操作:
var dataSet = Set(data)
var compareDataSet = Set(compareData)
if compareDataSet.isSubsetOf(dataSet) {
// Do something
}编辑:您的类需要符合可等价物。
class dataModel: Equatable {
var teamName : String = ""
var aboutTeams : String = ""
// var rate : String = "5" // team Rating
var messageID : String = ""
override func isEqual(_ object: Any?) -> Bool {
if let object = object as? dateModel {
return self.teamName == object.teamName && self.aboutTeams == object.aboutTeams && self.messageID == object.messageID
} else {
return false
}
}
}发布于 2019-11-25 16:17:14
您可以尝试使用此示例。
import UIKit
class ViewController: UIViewController, NavDelegate {
var data : [dataModel] = [dataModel]()
var compareData : [dataModel] = [dataModel]()
override func viewDidLoad() {
super.viewDidLoad()
data = [
dataModel(teamName: "cyber1", aboutTeams: "strong", messageID: "1001"),
dataModel(teamName: "cyber1", aboutTeams: "good", messageID: "1002")
]
compareData = [
dataModel(teamName: "cyber1", aboutTeams: "strong", messageID: "1001"),
dataModel(teamName: "cyber1", aboutTeams: "good 2", messageID: "1002")
]
let dataSet = Set(data)
let compareDataSet = Set(compareData)
if compareDataSet == dataSet {
print("compareDataSet and dataSet are equal")
}else{
print("compareDataSet and dataSet are not equal")
}
}
struct dataModel: Hashable {
var teamName : String = ""
var aboutTeams : String = ""
var messageID : String = ""
}
}https://stackoverflow.com/questions/59023952
复制相似问题