比较swift中两个struct的值

时间:2018-05-24 05:31:00

标签: swift swift4

我有两个struct和两个数组对应它我试图比较两个数组值并将其打印在一个已过滤的数组中我尝试使用过滤器但是它给了我一个错误我想要比较来自两者的id结构并得到一个单一的数组

Struct ONE

struct One {
    let ID: String
    let name: String
    let lastName: String
}

Array One

var oneData = [One]()
oneData = [One(ID: "1", name: "hello1", lastName: "last2"), One(ID: "1", name: "hello2", lastName: "last2"), One(ID: "2", name: "hello3", lastName: "last3"), One(ID: "3", name: "hello4", lastName: "last4")]

结构二

struct Two {
    let ID: String
    let name2: String
    let lastName2: String
}

数组二

var twoData = [Two]()
twoData = [Two(ID: "1", name2: "hello1", lastName2: "last1"), Two(ID: "2", name2: "hello2", lastName2: "last2"), Two(ID: "3", name2: "hello3", lastName2: "last3"), Two(ID: "4", name2: "hello4", lastName2: "last4"), Two(ID: "5", name2: "hello5", lastName2: "last5")]

我的过滤数组

var mainArray = [Two]()

我曾经过滤的代码,它给了我一个错误

mainArray = oneData.filter{ $0.ID == twoData.contains(where: $0.ID)}

4 个答案:

答案 0 :(得分:2)

如果您希望仅将oneData过滤为twoData中具有匹配ID字段的元素,则需要:

let mainArray = oneData.filter { i in twoData.contains { i.ID == $0.ID } }

答案 1 :(得分:1)

您的mainArray类型为[Two],并且您正尝试将[One]类型的数据放入mainArray。根据swift,这是错误的,你不能这样做。

你可以用另一种方式做到让我在10分钟内发布

现在你有2个选项可以制作通用协议,并用它确认结构,并按如下方式制作该协议类型的mainArray:

protocol Identifiable {
    var id: String {get set}
    var name: String {get set}
    var lastName: String {get set}
}

struct One: Identifiable{
    var id: String
    var name: String
    var lastName: String
}

struct Two: Identifiable{
    var id: String
    var name: String
    var lastName: String
}

现在使主要类型Array可识别如下

 var mainArray = [Identifiable]()

并过滤如下

 mainArray = oneData.filter{ i in twoData.contains { i.id == $0.id }}

另一个选择是不要使协议可识别并让结构像以前一样。 只需使[One]类型的mainArray不要忘记更改过滤器行的更改,即 由此:

 mainArray = oneData.filter{ $0.ID == twoData.contains(where: $0.ID)}

对此:

 mainArray = oneData.filter{ i in twoData.contains { i.id == $0.id }}

答案 2 :(得分:1)

获取数组oneData的对象,其ID与数组ID中任何对象的twoData匹配。你可以这样做:

    // Array One
    var oneData = [One]()
    oneData = [One(ID: "1", name: "hello1", lastName: "last2"),
               One(ID: "1", name: "hello2", lastName: "last2"),
               One(ID: "2", name: "hello3", lastName: "last3"),
               One(ID: "3", name: "hello4", lastName: "last4")]

    // Array Two
    var twoData = [Two]()
    twoData = [Two(ID: "1", name2: "hello1", lastName2: "last1"),
               Two(ID: "2", name2: "hello2", lastName2: "last2"),
               Two(ID: "3", name2: "hello3", lastName2: "last3"),
               Two(ID: "4", name2: "hello4", lastName2: "last4"),
               Two(ID: "5", name2: "hello5", lastName2: "last5")]

    let mainArray = oneData.filter { i in twoData.contains{ i.ID == $0.ID } }
    print(mainArray)

enter image description here

答案 3 :(得分:0)

Swift标准库有一个Equatable协议,我们可以通过在扩展中添加static == operator函数到我们的类型来采用。您应该只创建一个如下所示的结构

struct Employee {
  let id: String
  let name: String
  var lastName: String
}

extension Employee: Equatable {
  static func == (lhs: Employee, rhs: Employee) -> Bool {
    return lhs.name == rhs.name &&
    lhs.id == rhs.id &&
    lhs.lastName == rhs.lastName
  }
}