首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将类型“[dataModel]”的值转换为预期的参数类型(DataModel)抛出->布尔

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

Stack Overflow用户
提问于 2019-11-25 00:57:05
回答 4查看 292关注 0票数 1

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

代码语言:javascript
复制
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]'

数组被格式化为:

代码语言:javascript
复制
var data : [dataModel] = [dataModel] ()
var compareData : [dataModel] = [dataModel]()

我正在检查该数组是否设置为在替换数据和更新表之前发送的相同数组。

编辑:这是dataModels代码:

代码语言:javascript
复制
class dataModel {
   var teamName : String = ""

   var aboutTeams : String = ""

   // var rate : String = "5" // team Rating

   var messageID : String = ""
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-25 01:47:27

您可以比较dataModel中元素的属性,如果它们本质上是可比较/相等的,比如String或Int。如果您希望能够测试dataModel数组本身中特定元素的相等性,那么您必须使您的dataModel符合相等。

我相信您所面临的问题与使您的dataModel类或结构符合等价性有关,或者与您如何填充数据和compareData有关。

这个基本的例子应该给你一个如何做它的想法。它测试数据的不同部分(越来越小的实体)的相等性:

代码语言:javascript
复制
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的代码(类通常应该是大写的),所以下面是一个使用类的实际实现进行定制的示例:

代码语言:javascript
复制
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")
}

控制台输出是:

代码语言:javascript
复制
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

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2019-11-25 01:35:37

这是因为您试图使用的函数需要一个NSPredicate。

检查数组是否包含另一个数组的子集的一种方法是执行以下操作:

代码语言:javascript
复制
var dataSet = Set(data)
var compareDataSet = Set(compareData)

if compareDataSet.isSubsetOf(dataSet) {
   // Do something
}

编辑:您的类需要符合可等价物。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-11-25 16:17:14

您可以尝试使用此示例。

代码语言:javascript
复制
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 = ""
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59023952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档