我正在尝试评估输入的字符串是否与数组中的任何项匹配。当我在游乐场使用以下方法时,它似乎正常工作。但是,当我在Xcode 9.0 beta 6(9M214v)中使用完全相同的方法时,它不会返回正确的答案。
func isValid(_ item: String) -> Bool {
let whitelist = ["https://apple.com","https://facebook.com","https://stackoverflow.com"]
return whitelist.contains(where: {$0 <= item ? true : false })
}
还有一些异常情况,比如当我传入“https://twitter.com”时,它会返回true。我疯了吗?虽然我在这里,但是任何人都有不同的方法来解决这个问题吗?
答案 0 :(得分:2)
还有异常现象,比如当我进入&#34; https://twitter.com&#34; 它会回归真实。
根据您的代码段,Swift的版本是3还是4,您应该得到相同的 true
结果!为什么呢?
因为进行比较的contains(where:)
的逻辑与给定元素的相等的逻辑有关,所以你不能将contains
与数组一起使用不等于的元素。为了更清楚:
"https://apple.com" <= "https://twitter.com"
"https://facebook.com" <= "https://twitter.com"
"https://stackoverflow.com" <= "https://twitter.com"
所有语句的结果为true
(&#39; t&#39;字符大于&#39; a&#39;&#39; f&# 39;和&#39;)。
因此:
"https://zwebsite" <= "https://twitter.com"
会返回false
(&#39; t&#39;小于&#39; z&#39;)。
但是,要获得预期的结果,您可以像这样实现您的功能:
func isValid(_ item: String) -> Bool {
let whitelist = ["https://apple.com","https://facebook.com","https://stackoverflow.com"]
return whitelist.contains { $0 == item }
}
或者甚至是更短的contains
:
return whitelist.contains(item)
导致让
isValid("https://twitter.com")
返回false
。
答案 1 :(得分:0)
只需返回以下内容即可返回true
或false
:
return whitelist.contains(item)