检查数组是否包含字符串

时间:2017-09-12 06:26:03

标签: arrays swift swift4

我正在尝试评估输入的字符串是否与数组中的任何项匹配。当我在游乐场使用以下方法时,它似乎正常工作。但是,当我在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。我疯了吗?虽然我在这里,但是任何人都有不同的方法来解决这个问题吗?

2 个答案:

答案 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)

只需返回以下内容即可返回truefalse

return whitelist.contains(item)