Arrays 检查数组是否包含字符串

Arrays 检查数组是否包含字符串,arrays,swift,swift4,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 wh

我试图评估输入的字符串是否部分匹配数组中的任何项。当我在操场上使用以下方法时,它似乎工作正常。然而,当我在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  })
}
func有效(\uitem:String)->Bool{
让白名单=[”https://apple.com","https://facebook.com","https://stackoverflow.com"]

return whitelist.contains(其中:{$0只返回以下内容,它将返回
true
false

return whitelist.contains(item)
还有一些异常情况,比如当我经过时“ 它会变成真的

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

因为进行比较的逻辑与给定元素相等的逻辑有关,也就是说,不能将
contains
与非相等元素数组一起使用。更清楚地说:

"https://apple.com" <= "https://twitter.com"
"https://facebook.com" <= "https://twitter.com"
"https://stackoverflow.com" <= "https://twitter.com"
将返回
false
('t'小于'z')

但是,为了获得预期的结果,您可以实现如下功能:

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

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

    return whitelist.contains { $0 == item }
}
或者对于更短的
包含的

return whitelist.contains(item)
这导致了出租

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

要返回@MikeAlter评论的
false

<0$0,比较
$0的逻辑是什么?你说它在操场上有效。哪个版本?你实际上是说它在Swift 3中有效,而不是在Swift 4中有效?请澄清。@RMADY Swift 4操场。当我说它有效时,我的期望和对我生活中发生的事情的理解操场不正确。它应该检查字符串中的下一个字符,如“https://”,直到到达最后一个元素(字符),如果所有项都匹配,那么它将是一个相等项。因此,所发生的事情是,它评估每个字符是否<=位于相同位置的字符。我的印象是,它评估每个项时,将其作为一个字符串,而不是一个字符数组。我试图做的是查看特定URL的方案和主机是否匹配一个In数组。仅使用
contains
不会解释URL的其余部分,即使第一部分在数组中,也会返回
false
。这完全是另一种情况:)您应该使用
URL
URLComponenets
来实现它,我可以更新我的答案,但它与您问题的标题无关。。。
isValid("https://twitter.com")