无法将类型'[dataModel]'的值转换为预期参数类型'(dataModel)throws-> Bool'

时间:2019-11-25 00:57:05

标签: arrays swift

由于某种原因,我无法比较2个不同的数组,例如:

if (self.data.contains(where: self.compareData)){
}

抛出:

  

无法将类型“ [dataModel]”的值转换为预期的参数类型   '(数据模型)抛出->布尔'

并尝试使用==比较它们也会引发错误,例如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 = ""
}

4 个答案:

答案 0 :(得分:1)

这是因为您要使用的功能需要一个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
        }
    } 
}

答案 1 :(得分:1)

如果数据模型中的元素具有内在的可比性/相等性,则可以比较它们的属性,例如String或Int。如果要能够测试dataModel数组本身内特定元素的相等性,则必须使dataModel符合Equatable。

我相信您面临的问题与使dataModel类或struct符合Equatable或您如何填充数据和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

希望这会有所帮助!

答案 2 :(得分:1)

您可以尝试使用此示例。

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 = ""
    }
}

答案 3 :(得分:0)

如果您需要查看两个数组是否相等,则可以使用一个简单的函数来完成此操作:

func compare<T: Equatable>(_ array1: [T], _ array2: [T] ) -> Bool {
   guard array1.count == array2.count else {return false}
   for i in 0 ..< array1.count {
      if array1[i] != array2[i] { return false}
   }
   return true
}

您甚至可以将其构建为Array的扩展

extension Array where Element: Equatable{
   func compare(to array: [Element]) -> Bool {
      guard array.count == self.count else {return false}
      for i in 0 ..< array.count {
            if array[i] != self[i] { return false}
      }
      return true
   }
}

编译器不允许您比较两个不同类型的数组。