计算具有特定属性值的数组中的项目数

时间:2014-08-20 07:01:38

标签: ios arrays swift

我有一个Person()类:

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
    }
}

我有一个Person()数组

var peopleArray = [Person]()

我想计算数组中有

的人数
 isManager: true

我觉得这是在那里,但我可以找到它,或找到搜索参数。

感谢。

3 个答案:

答案 0 :(得分:27)

使用filter方法:

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

甚至更简单:

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

答案 1 :(得分:10)

您可以按如下方式使用reduce

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

或更紧凑的版本:

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

reduce将闭包(第二个参数)应用于数组的每个元素,传递为前一个元素获得的值(或初始值,即作为其第一个参数传递的0值)和当前的数组元素。在闭包中,您返回count加零或一,取决于isManager属性是否为true

有关standard library reference

reducefilter的更多信息

答案 2 :(得分:6)

count(where:)已从Xcode 10.2 beta 4中的Swift 5中删除。


在Swift 5和Xcode 10.2 beta 3中,如果要计算数组中与给定谓词匹配的元素数,可以使用Array的{​​{3}}方法。 count(where:)具有以下声明:

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

返回满足给定谓词的序列中的元素数。


以下Playground示例代码展示了如何使用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