代码之家  ›  专栏  ›  技术社区  ›  Audrey Rozario

比较swift中两个结构的值

  •  1
  • Audrey Rozario  · 技术社区  · 6 年前

    我有两个结构和两个与之对应的数组,我试图比较这两个数组的值,并在一个筛选数组中打印它。我确实尝试过使用筛选器,但它给了我一个错误,我想比较两个结构中的一个ID,并得到一个单独的数组。

    结构一

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

    第一列

    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 回复  |  直到 6 年前
        1
  •  1
  •   Ankit Jayaswal    6 年前

    获取数组对象 oneData 谁的 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

        2
  •  2
  •   David Berry    6 年前

    如果你想过滤 oneData 只有在中具有匹配ID字段的元素 twoData ,您需要:

    let mainArray = oneData.filter { i in twoData.contains { i.ID == $0.ID } }
    
        3
  •  1
  •   sanjaykmwt    6 年前

    你的 mainArray 属于类型 [Two] 你试图把数据类型 [One] 在里面 主阵列 . 根据斯威夫特的说法,这是错误的,你不能这样做。

    你可以用另一种方式,我10分钟后贴出来

    现在您有两个选项,要么使通用协议类似,并用它确认结构,然后使该协议类型的主数组如下:

    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
    }
    

    现在将类型的主数组标识为

     var mainArray = [Identifiable]()
    

    过滤如下

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

    另一个选项是不要使协议可识别,让结构像以前一样。 只需制作类型的主数组 [一] 只是不要忘记改变过滤线的变化,即 从这里:

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

    为此:

    twodata.contains中的mainarray=onedata.filter i i.id==$0.id
    
        4
  •  0
  •   Amrit Trivedi    6 年前

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

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