【问题标题】:Get shorter version of for loop?获得较短版本的 for 循环?
【发布时间】:2016-10-25 09:30:46
【问题描述】:

我正在使用 Swift 3.0 并且有此代码用于搜索数组中的项目作为字符串类型的扩展:

extension String {
    func equal(compareToArray : [String]) -> Bool {
        for s in compareToArray {
            if self == s {
                return true
            }
        }
        return false
    }
}

它运行良好,但我的问题是,我能做得更好(更短/更简单或更快)吗?

好的,另一个类似的示例:

func contains(compareToArray : [String]) -> Bool {
    for s in compareToArray {
        if self.contains(s) {
            return true
        }
    }
    return false
}

【问题讨论】:

    标签: arrays swift string optimization


    【解决方案1】:

    更短、更简单、更快

    let compareToArray = ["foo", "bar", "baz"]
    compareToArray.contains("bar")
    

    编辑:

    根据你的第二个例子

    !compareToArray.filter{ $0.contains("oo") }.isEmpty

    compareToArray.index(where: {$0.contains("oo")}) != nil
    

    【讨论】:

    • :-) 是的,你是对的。我添加了另一个示例,不应该转过来。 :-)
    • 好的,即使结果已经为真,该过滤器也会获取所有数组成员。它更短,但更慢。我无法决定哪个更好。 :-) 谢谢。
    • 您的第一个示例如何比 OP 快?当然,打字速度更快,但contains 在幕后做的事情完全相同。即使$0.contains("oo") 返回true,您的第二个示例也不必要地遍历整个compareToArray。使用compareToArray.contains{...} 会更好:)
    • @Hamish 你是对的。我用替代闭包更新了答案。
    • 太棒了!就是这样。更短,至少与显式版本一样快。非常感谢!
    【解决方案2】:

    如果你想检查一个元素是否属于一个数组,在 Swift 3.0 中这是一个更好的方法:

    使用:

    array.index(of: element) -> Int?

    例如:

    let myArray = ["a", "b", "c"]
    let needle = "b"
    
    if let pos = myArray.index(of: needle') {
      print("\(needle) is in array at position : \(pos)" 
    } else {
      print("It's not in array")
    }
    

    【讨论】:

    • 我正在寻找使用过滤器、映射等内部函数的 for 循环的一般优化...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2016-03-25
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多