如何在swift中计算数组中的特定项

JPC*_*JPC 3 arrays collections swift

假设我有下面任何对象的数组,我正在寻找一种方法来计算数组中的项目如下:

var OSes = ["iOS", "Android", "Android","Android","Windows Phone", 25]
Run Code Online (Sandbox Code Playgroud)

快速做下面这样的事情有一个简短的方法吗?

Oses.count["Android"]   // 3 
Run Code Online (Sandbox Code Playgroud)

Ant*_*nio 17

快速,紧凑和优雅的方法是使用以下reduce方法:

let count = OSes.reduce(0) { $1 == "Android" ? $0 + 1 : $0 }
Run Code Online (Sandbox Code Playgroud)

它比for循环更紧凑,并且比a更快filter,因为它不会生成新的数组.

reduce方法采用初始值,在我们的例子中为0,并且一个闭包应用于数组的每个元素.

闭包需要2个参数:

  • 上一次迭代的值(或初始值,在我们的例子中为0)
  • 当前迭代的数组元素

闭包返回的值用作下一次迭代中的第一个参数,或者作为reduce处理最后一个元素时方法的返回值

闭包只是检查当前元素是否Android:

  • 如果没有,它返回聚合值(传递给闭包的第一个参数)
  • 如果是,则返回该数字加1


zrz*_*zka 5

使用.filter以下命令非常简单:

OSes.filter({$0 == "Android"}).count // 3
Run Code Online (Sandbox Code Playgroud)

  • `reduce`的性能更高,但出于可读性考虑,我更喜欢`filter()。count`。 (4认同)