Get an array of property values from an object array Get an array of property values from an object array ios ios

Get an array of property values from an object array


You can use the map method, which transform an array of a certain type to an array of another type - in your case, from array of Employee to array of 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 5 offers many ways to get an array of property values from an array of similar objects. According to your needs, you may choose one of the six following Playground code examples to solve your problem.


1. Using map method

With Swift, types that conform to Sequence protocol have a map(_:) method. The following sample code shows how to use it:

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 worksprint(idArray) // prints [1, 2, 4]

2. Using for loop

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. Using while loop

Note that with Swift, behind the scenes, a for loop is just a while loop over a sequence's iterator (see IteratorProtocol for more details).

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. Using a struct that conforms to IteratorProtocol and Sequence protocols

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. Using Collection protocol extension and 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. Using KVC and NSArray's value(forKeyPath:) method

Note that this example requires class Employee to inherit from NSObject.

import Foundationclass Employee: NSObject {    @objc 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 NSArrayif let idArray = employeeNSArray.value(forKeyPath: #keyPath(Employee.id)) as? [Int] {    print(idArray) // prints [1, 2, 4]}