我想避免下面的示例代码中的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")
}
答案 0 :(得分:3)
这可以简洁地完成:
if prefixes.contains(where: number.hasPrefix) {
print("found")
}
那么,这是怎么工作的?
contains(where:)
采取闭包操作,该闭包被prefixes
数组的每个元素调用,以确定该元素是否符合所需条件。由于prefixes
是String
的数组,因此该闭包具有签名(String) -> Bool
,这意味着它需要一个String
并返回一个Bool
。 contains(where:)
将继续为prefixes
数组中的每个元素调用给定的闭包,直到它返回true
或直到prefixes
数组中的项目用完为止,答案是false
(prefixes
不包含符合条件的项目)。
在这种情况下,我们将函数number.hasPrefix
作为闭包传递。通常,您可以使用number.hasPrefix
来调用number.hasPrefix("212")
。如果没有参数,number.hasPrefix
指的是在hasPrefix
上调用的函数number
,并且该函数具有我们正在寻找的签名:(String) -> Bool
。因此它可用作contains(where:)
的闭包。
因此,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")
}