Swift 搜索 Array/NSArray 多个值
Swift search Array/NSArray for multiple values
两个方面的问题:
var array = [1,2,3,4,5]
contains(array, 0) // false
var array2: NSArray = [1,2,3,4,5]
array2.containsObject(4) // true
有没有办法在数组中搜索超过 1 个值? IE。我可以在下面编写以在数组中搜索多个值,如果找到任何值,则 return 为 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
一种选择是使用 Set
作为搜索词:
var array = [1,2,3,4,5]
let searchTerms: Set = [0,2,3]
!searchTerms.isDisjointWith(array)
(您必须否定 isDisjointWith
的值,因为它 returns false
当至少找到一个项时。)
请注意,您还可以扩展 Array
以为此添加 shorthand:
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(([=12=] as! NSNumber).integerValue) }
闭包语法的解释(如评论中所要求的):如果它是最后一个参数,则可以将闭包放在方法调用的 ()
之外,如果它是唯一的参数,则可以省略 ()
完全。 [=22=]
是闭包第一个参数的默认名称(</code> 是第二个,依此类推)。如果闭包只有一个表达式,则 <code>return
可以省略。长等价物:
array2.contains({ (num) in
return searchTerms.contains((num as! NSNumber).integerValue)
})
您可以将 contains 与第二个数组链接在一起:
// Swift 1.x
contains(array) { contains([0, 2, 3], [=10=]) }
// Swift 2 (as method)
array.contains{ [0, 2, 3].contains([=10=]) }
// 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)
// Xcode 12
array.contains(where: [0, 2, 3].contains)
两个方面的问题:
var array = [1,2,3,4,5]
contains(array, 0) // false
var array2: NSArray = [1,2,3,4,5]
array2.containsObject(4) // true
有没有办法在数组中搜索超过 1 个值? IE。我可以在下面编写以在数组中搜索多个值,如果找到任何值,则 return 为 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
一种选择是使用 Set
作为搜索词:
var array = [1,2,3,4,5]
let searchTerms: Set = [0,2,3]
!searchTerms.isDisjointWith(array)
(您必须否定 isDisjointWith
的值,因为它 returns false
当至少找到一个项时。)
请注意,您还可以扩展 Array
以为此添加 shorthand:
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(([=12=] as! NSNumber).integerValue) }
闭包语法的解释(如评论中所要求的):如果它是最后一个参数,则可以将闭包放在方法调用的 ()
之外,如果它是唯一的参数,则可以省略 ()
完全。 [=22=]
是闭包第一个参数的默认名称(</code> 是第二个,依此类推)。如果闭包只有一个表达式,则 <code>return
可以省略。长等价物:
array2.contains({ (num) in
return searchTerms.contains((num as! NSNumber).integerValue)
})
您可以将 contains 与第二个数组链接在一起:
// Swift 1.x
contains(array) { contains([0, 2, 3], [=10=]) }
// Swift 2 (as method)
array.contains{ [0, 2, 3].contains([=10=]) }
// 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)
// Xcode 12
array.contains(where: [0, 2, 3].contains)