Получить массив значений свойств из массива объектов

Есть класс под названием Employee .

 class Employee { var id: Int var firstName: String var lastName: String var dateOfBirth: NSDate? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } 

И у меня есть массив объектов Employee . Теперь мне нужно извлечь id всех этих объектов в этом массиве в новый массив.

Я также нашел этот аналогичный вопрос . Но он находится в Objective-C, поэтому он использует valueForKeyPath для достижения этого.

Как я могу сделать это в Swift?

Вы можете использовать метод map , который преобразует массив определенного типа в массив другого типа – в вашем случае – от массива Employee до массива Int :

 var array = [Employee]() array.append(Employee(id: 4, firstName: "", lastName: "")) array.append(Employee(id: 2, firstName: "", lastName: "")) let ids = array.map { $0.id } 

Swift 3 предлагает множество способов получить массив значений свойств из массива похожих объектов. В соответствии с вашими потребностями и вкусами вы можете выбрать один из шести следующих примеров кода площадки для решения вашей проблемы.


1. Использование метода map

Swift предоставляет метод map(_:) для типов, соответствующих протоколу Sequence (включая Array ). (см. также « Преобразование массива» )

 class Employee { let id: Int, firstName: String, lastName: String init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } let employeeArray = [ Employee(id: 1, firstName: "Jon", lastName: "Skeet"), Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"), Employee(id: 4, firstName: "Hans", lastName: "Passant") ] let idArray = employeeArray.map({ (employee: Employee) -> Int in employee.id }) // let idArray = employeeArray.map { $0.id } // also works print(idArray) // prints [1, 2, 4] 

2. Использование for цикла

 class Employee { let id: Int, firstName: String, lastName: String init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } let employeeArray = [ Employee(id: 1, firstName: "Jon", lastName: "Skeet"), Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"), Employee(id: 4, firstName: "Hans", lastName: "Passant") ] var idArray = [Int]() for employee in employeeArray { idArray.append(employee.id) } print(idArray) // prints [1, 2, 4] 

3. Использование цикла while

Обратите внимание, что при Swift за кулисами цикл for представляет собой всего лишь цикл while над итератором sequence (подробнее см. IteratorProtocol ).

 class Employee { let id: Int, firstName: String, lastName: String init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } let employeeArray = [ Employee(id: 1, firstName: "Jon", lastName: "Skeet"), Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"), Employee(id: 4, firstName: "Hans", lastName: "Passant") ] var idArray = [Int]() var iterator = employeeArray.makeIterator() while let employee = iterator.next() { idArray.append(employee.id) } print(idArray) // prints [1, 2, 4] 

4. Использование struct , соответствующей протоколам IteratorProtocol и Sequence

 class Employee { let id: Int, firstName: String, lastName: String init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } struct EmployeeSequence: Sequence, IteratorProtocol { let employeeArray: [Employee] private var index = 0 init(employeeArray: [Employee]) { self.employeeArray = employeeArray } mutating func next() -> Int? { guard index < employeeArray.count else { return nil } defer { index += 1 } return employeeArray[index].id } } let employeeArray = [ Employee(id: 1, firstName: "Jon", lastName: "Skeet"), Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"), Employee(id: 4, firstName: "Hans", lastName: "Passant") ] let employeeSequence = EmployeeSequence(employeeArray: employeeArray) let idArray = Array(employeeSequence) print(idArray) // prints [1, 2, 4] 

5. Использование расширений протокола Collection и AnyIterator

 class Employee { let id: Int, firstName: String, lastName: String init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } extension Collection where Iterator.Element: Employee { func getIDs() -> Array<Int> { var index = startIndex let iterator: AnyIterator<Int> = AnyIterator { defer { index = self.index(index, offsetBy: 1) } return index != self.endIndex ? self[index].id : nil } return Array(iterator) } } let employeeArray = [ Employee(id: 1, firstName: "Jon", lastName: "Skeet"), Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"), Employee(id: 4, firstName: "Hans", lastName: "Passant") ] let idArray = employeeArray.getIDs() print(idArray) // prints [1, 2, 4] 

6. Использование значения KVC и NSArray value(forKeyPath:)

Обратите внимание: этот пример требует, чтобы class Employee наследовал от NSObject .

 import Foundation class Employee: NSObject { let id: Int, firstName: String, lastName: String init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } let employeeArray = [ Employee(id: 1, firstName: "Jon", lastName: "Skeet"), Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"), Employee(id: 4, firstName: "Hans", lastName: "Passant") ] let employeeNSArray = employeeArray as NSArray if let idArray = employeeNSArray.value(forKeyPath: #keyPath(Employee.id)) as? [Int] { print(idArray) // prints [1, 2, 4] } 

Дополнительную информацию см. В разделе Репетиция повторных массивов GitHub.

  • iOS swift удаляет элементы массива из другого массива
  • Поиск строк в строчном массиве в объекте c
  • метод быстрой мутации, отправленный на неизменяемый объект
  • Совпадение шаблонов Swift с массивами
  • Как заставить массив быстрых опций (красиво)
  • Переупорядочить буквы из массива и проверить, находится ли компоновка в массиве
  • Установка узла для случайного всплытия из массива точек и постепенного падения на скорости
  • Как преобразовать в
  • Swift преобразование байтового массива в целые числа
  • Swift - массив от любого до массива строк
  • Списки ресурсов и быстрые массивы
  • Interesting Posts

    AFNetworking / NSURLConnection HTTPS продолжают жить, демонстрируя странное поведение

    iOS: всплывающее меню не ведет себя в соответствии с набором первых ответчиков

    NSMutableArray removeAllObjects вызывает сбой

    Обновление iPhone приложения Vs новой версии

    *** Ошибка утверждения в –

    Как кэшировать изображения, загруженные с сервера, для нескольких таблиц в iOS

    Можно ли ограничить прокрутку в UICollectionView подмножеством элементов коллекции?

    Можно ли использовать кнопки управления громкостью iPhone для каких-то других целей?

    Чат, беседа, обмен сообщениями – модель CoreData

    Не удается запустить симулятор iphone; "не отвечает". Xcode 7, симулятор версии 9 (для iOS 9)

    Иерархия контроллера трассировки в Swift

    Google plus API для публикации на стене, например, Facebook

    iPhone MKMapView: укажите регион карты, чтобы показать все контакты на карте

    UIButton в режиме Modal View через UIToolBar через UITabBar Touch не обнаружен

    Как использовать CocoaPods с несколькими подпроектами Framework

    Давайте будем гением компьютера.