2015-10-19 2 views
3

Цель: у меня есть два разных класса и два массива, содержащие элементы каждого класса. Используя Swift 2.0, я хотел бы найти уникальные элементы одного массива по сравнению с другими на основе конкретных атрибутов каждого класса.iOS Swift: как найти уникальные элементы массивов разных типов на основе определенных атрибутов

Пример:

class A { 
    var name: String 
    init(name: String) { 
      self.name = name 
    } 
} 

class B { 
    var title: String 
    init(title: String) { 
      self.title = title 
    } 
} 

let aArray = [A(name:"1"), A(name:"2"), A(name:"3"), A(name:"4")] 
let bArray = [B(title:"1"), B(title:"2"), B(title:"5")] 

Итак, я ищу какие-либо операции между aArray и Баррэ, которая возвращает 3-й и 4-й элемент aArray, потому что они являются уникальными в aArray, где основа для сравнения является атрибуты A.name и B.title.

Конечно, при обратном порядке операции выбирается третий элемент bArray, потому что он уникален в bArray.

Я знаю, что могу выполнить задачу прямо с помощью простой петли, но я надеялся на что-то более элегантное и более оптимизированное. Но если цикл for работает так же быстро или быстрее, чем что-либо более интересное, я с удовольствием использую его так же хорошо.

ответ

5

Я не уверен, что фантазии или элегантный этот код, но мы могли бы сделать что-то вроде этого:

let mappedArray = bArray.map { $0.title } 
let filteredArray = aArray.filter { !mappedArray.contains($0.name) } 

Так что, когда мы хотим, чтобы уникальные элементы из aArray, мы сначала отобразить элементы от bArray, чтобы получить массив значение, которое мы хотим на самом деле сравнивать:

let mappedArray = bArray.map { $0.title } 

mappedArray просто массив строк, основанных на title объектов объекта в bArray.

Далее мы используем метод filter для фильтрации объектов от aArray. Метод filter возвращает массив с объектами, которые проходят тест в нашем закрытии. Тест, который мы хотим применить, - это объекты, которые являются , а не, содержащиеся в отображаемом массиве, который мы только что создали.

let filteredArray = aArray.filter { !mappedArray.contains($0.name) } 

Если мы хотим сделать это по-другому, просто изменить несколько вещей:

let mappedArray = aArray.map { $0.name } 
let filteredArray = bArray.filter { !mappedArray.contains($0.title) } 
+0

Благодаря nhgrif, именно то, что я искал! Очень лаконично и работает. Да, мне нужно больше узнать о функциях карты и фильтра. – davejlin

+0

Хороший тент, это то, что я ищу, но вторая часть кода не работала от меня:/ Это изменение любой ссылки с новыми версиями Swift? –

+0

Какая часть точно дает ошибку и что такое ошибка? – nhgrif

Смежные вопросы