【问题标题】:how to count specific items in array in swift如何快速计算数组中的特定项目
【发布时间】:2023-03-29 12:47:01
【问题描述】:

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

var OSes = ["iOS", "Android", "Android","Android","Windows Phone", 25]

有没有一种捷径可以让 swift 在下面做这样的事情?

Oses.count["Android"]   // 3 

【问题讨论】:

    标签: arrays swift collections


    【解决方案1】:

    Swift 5count(where:)

    let countOfAndroid = OSes.count(where: { $0 == "Android" })
    

    Swift 4 或更低版本 with filter(_:)

    let countOfAndroid = OSes.filter({ $0 == "Android" }).count 
    

    【讨论】:

    • count(where:) 在 Swift 5 中曾短暂地与我们在一起,但遗憾的是,由于与类型检查系统的冲突,它被删除了。
    • 这个 Swift 5.0 特性在 beta 测试中被撤回,因为它会导致类型检查器的性能问题。希望它会在 Swift 5.1 中及时回归,也许会用一个新名称来避免出现问题。 hackingwithswift.com/articles/126/whats-new-in-swift-5-0
    【解决方案2】:

    使用reduce 方法是一种快速、紧凑且优雅的方法:

    let count = OSes.reduce(0) { $1 == "Android" ? $0 + 1 : $0 }
    

    它比for 循环更紧凑,比filter 更快,因为它不会生成新数组。

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

    闭包有2个参数:

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

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

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

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

    【讨论】:

    • 这是对reduce() 的很好的解释。 +1
    • 我总是使用for case 语法来处理 Array 中的 count 特定项。你的方法更快捷。
    【解决方案3】:

    .filter 非常简单:

    OSes.filter({$0 == "Android"}).count // 3
    

    【讨论】:

    • reduce 性能更高,但我更喜欢 filter().count 以提高可读性。
    • 是的,总是在可读性和速度/有效性之间妥协。取决于基础数据和它们的数量。如果没有伤害,我更喜欢可读性。
    • @AirspeedVelocity 提供了有趣的 comment 关于性能的信息。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2012-12-05
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多