Swift String hasPrefix使用字符串数组

时间:2018-11-15 21:30:22

标签: swift

我想避免下面的示例代码中的if语句,而是对我的数字字符串进行一次hasPrefix调用,然后传递prefixes数组。在Swift中有没有办法做到这一点?

let prefixes: [String] = ["212", "213", "214"]
let number: String = "213-555-1212"

if number.hasPrefix("212") || number.hasPrefix("213") {
    print("found")
}

4 个答案:

答案 0 :(得分:3)

这可以简洁地完成:

if prefixes.contains(where: number.hasPrefix) {
    print("found")
}

那么,这是怎么工作的?

  1. contains(where:)采取闭包操作,该闭包被prefixes数组的每个元素调用,以确定该元素是否符合所需条件。由于prefixesString的数组,因此该闭包具有签名(String) -> Bool,这意味着它需要一个String并返回一个Boolcontains(where:)将继续为prefixes数组中的每个元素调用给定的闭包,直到它返回true或直到prefixes数组中的项目用完为止,答案是falseprefixes不包含符合条件的项目)。

  2. 在这种情况下,我们将函数number.hasPrefix作为闭包传递。通常,您可以使用number.hasPrefix来调用number.hasPrefix("212")。如果没有参数,number.hasPrefix指的是在hasPrefix上调用的函数number,并且该函数具有我们正在寻找的签名:(String) -> Bool。因此它可用作contains(where:)的闭包。

  3. 因此,prefixes.contains(where: number.hasPrefix)从数组中取出每个prefix,并检查number.hasPrefix(prefix)是否返回true。如果找到一个,它将停止搜索并返回true。如果它们全部返回false,则prefixes.contains(where:)返回false。

答案 1 :(得分:0)

您可以尝试

if prefixes.filter { number.hasPrefix($0)}.count != 0 {

}

!prefixes.filter { number.hasPrefix($0)}.isEmpty 

prefixes.contains { number.hasPrefix($0) }

答案 2 :(得分:0)

怎么样:

prefixes.forEach { prefix in
    if number.hasPrefix(prefix) {
        print("found")
    }
}

您可能要确保prefixes数组没有重复项(=实际上是一个集合)。

答案 3 :(得分:0)

如果可读性很重要,则可以尝试以下操作:

extension String {
    func hasAnyPrefix(_ prefixes: [String]) -> Bool {
        return prefixes.contains { self.hasPrefix($0) }
    }
}

if number.hasAnyPrefix(prefixes) {
    print("found")
}