Swift搜索Array / NSArray以获取多个值

时间:2015-07-26 05:28:14

标签: ios arrays swift nsarray

两个方面的问题:

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

2 个答案:

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