比方说,我有以下的任何对象的数组,我正在寻找一种方法来计算数组中的项目如下:
var OSes = ["iOS", "Android", "Android","Android","Windows Phone", 25]
是否有一个快速的短期办法做这样的事情下面?
Oses.count["Android"] // 3
快速,紧凑和优雅的方式来做到这一点是通过使用reduce
方法:
let count = OSes.reduce(0) { $1 == "Android" ? $0 + 1 : $0 }
它比for
循环更加紧凑,比filter
更快,因为它不会产生一个新的数组。
该reduce
方法需要一个初始值,在我们的情况下为0,和封闭,施加到所述阵列的每个元素。
封闭件需要两个参数:
由封闭的返回值被用作第一参数的下一次迭代,或者作为reduce
方法的返回值时的最后一个元素已被处理
封闭件简单地检查如果当前元素是Android
:
这是很简单的用.filter
:
OSes.filter({$0 == "Android"}).count // 3
斯威夫特5 count(where:)
let countOfAndroid = OSes.count(where: { $0 == "Android" })
迅速4或更小filter(_:)
let countOfAndroid = OSes.filter({ $0 == "Android" }).count