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

Nat*_*olz 16 arrays ios 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
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个Person()数组

var peopleArray = [Person]()
Run Code Online (Sandbox Code Playgroud)

我想计算数组中拥有的人数

 isManager: true
Run Code Online (Sandbox Code Playgroud)

我觉得这是在那里,但我无法找到它,或找到搜索参数.

谢谢.

Mic*_*uba 28

使用filter方法:

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

甚至更简单:

let moreCount = peopleArray.filter{ $0.isManager! }.count
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个解决方案工作得很好,但必须说,如果与“reduce”相比,它是低效的(请参阅我的答案),因为它创建了一个新数组 - 但 __if 需要过滤数组本身 __ 而不仅仅是它的 `count` 属性, __then这是正确的解决方案__。 (2认同)

Ant*_*nio 10

您可以使用reduce如下:

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

或更紧凑的版本:

let count = peopleArray.reduce(0) { $0 + ($1.isManager! ? 1 : 0) }
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息reduce,并filter标准库参考

  • 或者`peopleArray.reduce(0){$ 0 + Int($ 1.isManager!)}` (3认同)

Ima*_*tit 6

随着斯威夫特5,你可以使用count(where:)Array,如果你希望计算匹配给定谓词数组中元素数量的方法.count(where:)有以下声明:

func count(where predicate: (Element) throws -> Bool) rethrows -> Int
Run Code Online (Sandbox Code Playgroud)

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


以下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
Run Code Online (Sandbox Code Playgroud)

  • count(where:) 已从 Xcode 10.2 beta 4 中的 Swift 5 中删除,并且似乎从未返回。 (2认同)