Сравните значение из двух структур в Swift - PullRequest
0 голосов
/ 24 мая 2018

Мне соответствуют два массива struct и два, и я пытаюсь сравнить два значения массива и вывести его в один отфильтрованный массив. Я пытался использовать фильтр, но он выдает ошибку. Я хочу сравнить идентификатор из обоихструктура и получить один единственный массив

Struct ONE

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

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 голосов
/ 24 мая 2018

Чтобы получить объекты массива 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

0 голосов
/ 24 мая 2018

ваш 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
}

теперь делает основной массив типа Identifiable следующим образом

 var mainArray = [Identifiable]()

и фильтрует следующим образом

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

Другой вариант - не делать протокол опознаваемым и оставить структуры такими, какими они были раньше.И просто сделайте mainArray типа [One], только не забудьте изменить изменение строки фильтра, т. Е. Начиная с этого:

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

На это:

 mainArray = oneData.filter{ i in twoData.contains { i.id == $0.id }}
0 голосов
/ 24 мая 2018

Если вы хотите отфильтровать oneData только те элементы, которые имеют совпадающее поле идентификатора в twoData, вам нужно:

let mainArray = oneData.filter { i in twoData.contains { i.ID == $0.ID } }
0 голосов
/ 24 мая 2018

Стандартная библиотека Swift имеет протокол Equatable, который мы можем принять, добавив статическую операторную функцию == в наш тип в расширении.Вы должны создать только одну структуру, как показано ниже

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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...