如何计算 swift 数组中的特定项目
how to count specific items in array in swift
假设我有以下任何对象的数组,我正在寻找一种方法来计算数组中的项目,如下所示:
var OSes = ["iOS", "Android", "Android","Android","Windows Phone", 25]
是否有 swift 执行下面类似操作的捷径?
Oses.count["Android"] // 3
使用 .filter
非常简单:
OSes.filter({[=10=] == "Android"}).count // 3
一种快速、紧凑和优雅的方法是使用 reduce
方法:
let count = OSes.reduce(0) { == "Android" ? [=10=] + 1 : [=10=] }
它比 for
循环更紧凑,比 filter
更快,因为它不会生成新数组。
reduce
方法采用初始值(在我们的例子中为 0)和一个闭包,应用于数组的每个元素。
闭包有两个参数:
- 前一次迭代的值(或初始值,在我们的例子中为 0)
- 当前迭代的数组元素
由闭包编辑的值 return 用作下一次迭代的第一个参数,或者当最后一个元素已被删除时用作 reduce
方法的 return 值已处理
闭包简单地检查当前元素是否为Android
:
- 如果不是,它return是聚合值(传递给闭包的第一个参数)
- 如果是,return是那个数字加一
Swift 5 与 count(where:)
let countOfAndroid = OSes.count(where: { [=10=] == "Android" })
Swift 4 或更少 和 filter(_:)
let countOfAndroid = OSes.filter({ [=11=] == "Android" }).count
假设我有以下任何对象的数组,我正在寻找一种方法来计算数组中的项目,如下所示:
var OSes = ["iOS", "Android", "Android","Android","Windows Phone", 25]
是否有 swift 执行下面类似操作的捷径?
Oses.count["Android"] // 3
使用 .filter
非常简单:
OSes.filter({[=10=] == "Android"}).count // 3
一种快速、紧凑和优雅的方法是使用 reduce
方法:
let count = OSes.reduce(0) { == "Android" ? [=10=] + 1 : [=10=] }
它比 for
循环更紧凑,比 filter
更快,因为它不会生成新数组。
reduce
方法采用初始值(在我们的例子中为 0)和一个闭包,应用于数组的每个元素。
闭包有两个参数:
- 前一次迭代的值(或初始值,在我们的例子中为 0)
- 当前迭代的数组元素
由闭包编辑的值 return 用作下一次迭代的第一个参数,或者当最后一个元素已被删除时用作 reduce
方法的 return 值已处理
闭包简单地检查当前元素是否为Android
:
- 如果不是,它return是聚合值(传递给闭包的第一个参数)
- 如果是,return是那个数字加一
Swift 5 与 count(where:)
let countOfAndroid = OSes.count(where: { [=10=] == "Android" })
Swift 4 或更少 和 filter(_:)
let countOfAndroid = OSes.filter({ [=11=] == "Android" }).count