检查数组是否包含字符串

Checking if an array contains a string

我正在尝试评估输入的字符串是否部分匹配数组中的任何项目。当我在操场上使用以下方法时,它似乎可以正常工作。但是,当我在 Xcode 9.0 beta 6 (9M214v) 中使用完全相同的方法时,它不会 return 正确答案。

func isValid(_ item: String)  -> Bool {
    let whitelist = ["https://apple.com","https://facebook.com","https://whosebug.com"]

    return whitelist.contains(where: {[=10=] <= item ? true : false  })
}

还有一些异常情况,比如当我传入“https://twitter.com”时,它会 return 为真。我疯了吗?当我在这里时,有人有不同的方法来解决这个问题吗?

只需 return 以下,将 return truefalse:

return whitelist.contains(item)

theres also anomalies like when I passed in "https://twitter.com" it'll return true.

无论 Swift 的版本是 3 还是 4,根据您的代码片段,您应该得到 相同 true 结果!为什么?

因为contains(where:)做比较的逻辑与给定元素相等的逻辑有关,即你不能使用contains 与不可等同的元素数组。为了更清楚:

"https://apple.com" <= "https://twitter.com"
"https://facebook.com" <= "https://twitter.com"
"https://whosebug.com" <= "https://twitter.com"

all 语句的结果将是 true('t' 字符大于 'a'、'f' 和 's').

因此:

"https://zwebsite" <= "https://twitter.com"

会returnsfalse('t'小于'z')。

但是,要获得预期的结果,您可以像这样实现函数:

func isValid(_ item: String)  -> Bool {

    let whitelist = ["https://apple.com","https://facebook.com","https://whosebug.com"]

    return whitelist.contains { [=12=] == item }
}

或者更短的 contains:

return whitelist.contains(item)

这导致

isValid("https://twitter.com")

到returnsfalse.