简体   繁体   中英

Count number of items in an array with a specific property value

I have a Person() class:

class Person : NSObject {

    var firstName : String
    var lastName : String
    var imageFor : UIImage?
    var isManager : Bool?

    init (firstName : String, lastName: String, isManager : Bool) {
        self.firstName = firstName
        self.lastName = lastName
        self.isManager = isManager
    }
}

I have an array of Person()

var peopleArray = [Person]()

I want to count the number of people in the array who have

 isManager: true

I feel this is out there, but I can;t find it, or find the search parameters.

Thanks.

Use filter method:

let managersCount = peopleArray.filter { (person : Person) -> Bool in
    return person.isManager!
}.count

or even simpler:

let moreCount = peopleArray.filter{ $0.isManager! }.count

You can use reduce as follows:

let count = peopleArray.reduce(0, combine: { (count: Int, instance: Person) -> Int in
    return count + (instance.isManager! ? 1 : 0) }
)

or a more compact version:

let count = peopleArray.reduce(0) { $0 + ($1.isManager! ? 1 : 0) }

reduce applies the closure (2nd parameter) to each element of the array, passing the value obtained for the previous element (or the initial value, which is the 0 value passed as its first parameter) and the current array element. In the closure you return count plus zero or one, depending on whether the isManager property is true or not.

More info about reduce and filter in the standard library reference

count(where:) was removed from Swift 5 in Xcode 10.2 beta 4.


With Swift 5 and Xcode 10.2 beta 3, you can use Array 's count(where:) method if you want to count the number of elements in an array that match a given predicate. count(where:) has the following declaration:

func count(where predicate: (Element) throws -> Bool) rethrows -> Int

Returns the number of elements in the sequence that satisfy the given predicate.


The following Playground sample code shows how to use count(where:) :

struct Person {
    let name: String
    let isManager: Bool
}

let array = [
    Person(name: "Jane", isManager: true),
    Person(name: "Bob", isManager: false),
    Person(name: "Joe", isManager: true),
    Person(name: "Jill", isManager: true),
    Person(name: "Ted", isManager: false)
]

let managerCount = array.count(where: { (person: Person) -> Bool in
    return person.isManager == true
})
// let managerCount = array.count { $0.isManager } // also works

print(managerCount) // prints: 3

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM