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

Есть класс под названием 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.

  • Как обмениваться данными с содержимым приложения с помощью NSUserDefaults? - Сегодня виджет расширения
  • Установка узла для случайного всплытия из массива точек и постепенного падения на скорости
  • C-Struct vs Object
  • подстрока с строкой массива - Swift
  • Основы iOS5 JSON
  • Правильный способ хранения и передачи данных между классами
  • Swift и JSON анализируют только объект, а не массив
  • Удалите пользовательский объект из массива (Swift)
  • Swift: разные объекты в одном массиве?
  • iOS Swift: как проверить, существует ли объект в массиве, поэтому я не добавляю его в него или не создаю с ним GMSMarker?
  • Как преобразовать в
  • Interesting Posts

    Может ли приложение работать, пока экран заблокирован, на взломанном iphone?

    Селектор не работает на моем быстром UIBarButtonItem

    Загрузите локальный html в UIWebView с помощью swift

    Добавьте пользовательские «числовые» изображения в SKLabelNode в качестве показателя в SpriteKit с Swift

    Получить выбранное значение UIPickerView

    Как переключаться между двумя ограничениями автоматической компоновки?

    Снять выделенный текст в UITextView

    Ошибка входа в систему с помощью SWRevealViewController

    Приведение подсмотра перед всеми другими видами

    Swift iOS Twitter API не работает

    Как отключить и скрыть UITextField

    Как открыть приложение электронной почты iphone из моего собственного приложения?

    Использование протоколов Obj-C, таких как Java-интерфейсы для подключения к классам

    iOS 6 возвращает ориентацию после функции увольненияModalViewController

    Библиотека? Статическая? Динамический? Или Рамки? Проект внутри другого проекта

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