两个方面的问题:
var array = [1,2,3,4,5]
contains(array, 0) // false
var array2: NSArray = [1,2,3,4,5]
array2.containsObject(4) // true
有没有办法搜索一个数组超过1的值?即。我可以在下面写下来搜索数组中的多个值,如果找到任何值,则返回true吗?问题的第二部分是我如何为NSArray做到这一点?
var array = [1,2,3,4,5]
contains(array, (0,2,3)) // this doesn't work of course but you get the point
答案 0 :(得分:7)
一种选择是使用Set
作为搜索字词:
var array = [1,2,3,4,5]
let searchTerms: Set = [0,2,3]
!searchTerms.isDisjointWith(array)
(您必须否定isDisjointWith
的值,因为当找到至少一个术语时它会返回false
。)
请注意,您还可以扩展Array
以添加简写:
extension Array where Element: Hashable {
func containsAny(searchTerms: Set<Element>) -> Bool {
return !searchTerms.isDisjointWith(self)
}
}
array.containsAny([0,2,3])
对于NSArray
,您可以使用contains
的版本来获取一个块以确定匹配:
var array2: NSArray = [1,2,3,4,5]
array2.contains { searchTerms.contains(($0 as! NSNumber).integerValue) }
闭包语法的解释(如注释中所要求的):如果它是最后一个参数,你可以将闭包放在方法调用的()
之外,如果它是唯一的参数你可以完全省略()
。 $0
是闭包的第一个参数的默认名称($1
将是第二个,等等)。如果闭包只是一个表达式,则return
可以省略。长期等价物:
array2.contains({ (num) in
return searchTerms.contains((num as! NSNumber).integerValue)
})
答案 1 :(得分:2)
您可以将第一个数组与第二个数组链接起来:
// Swift 1.x
contains(array) { contains([0, 2, 3], $0) }
// Swift 2 (as method)
array.contains{ [0, 2, 3].contains($0) }
// and since Xcode 7 beta 2 you can pass the contains function which is associated to the array ([0, 2, 3])
array.contains([0, 2, 3].contains)