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

Chr*_*ris 3 arrays nsarray ios swift

两个方面的问题:

var array = [1,2,3,4,5]
contains(array, 0) // false

var array2: NSArray = [1,2,3,4,5]
array2.containsObject(4) // true
Run Code Online (Sandbox Code Playgroud)

有没有办法搜索一个数组超过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
Run Code Online (Sandbox Code Playgroud)

Ark*_*kku 7

一种选择是使用a Set作为搜索词:

var array = [1,2,3,4,5]
let searchTerms: Set = [0,2,3]
!searchTerms.isDisjointWith(array)
Run Code Online (Sandbox Code Playgroud)

(你必须否定其中的值isDisjointWith,因为false当至少找到一个术语时它会返回.)

请注意,您还可以扩展Array为此添加简写:

extension Array where Element: Hashable {
    func containsAny(searchTerms: Set<Element>) -> Bool {
        return !searchTerms.isDisjointWith(self)
    }
}
array.containsAny([0,2,3])
Run Code Online (Sandbox Code Playgroud)

至于NSArray,您可以使用其版本contains来确定匹配:

var array2: NSArray = [1,2,3,4,5]
array2.contains { searchTerms.contains(($0 as! NSNumber).integerValue) }
Run Code Online (Sandbox Code Playgroud)

闭包语法的解释(在注释中请求):()如果它是最后一个参数,你可以将闭包放在方法调用之外,如果它是唯一的参数,你可以()完全省略它.$0是闭包的第一个参数的默认名称($1将是第二个,等等).return如果闭包只是一个表达式,则可以省略.长期等价物:

array2.contains({ (num) in
    return searchTerms.contains((num as! NSNumber).integerValue)
})
Run Code Online (Sandbox Code Playgroud)


Qby*_*yte 5

您可以将包含与第二个数组链接在一起:

// 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)

// Xcode 12
array.contains(where: [0, 2, 3].contains)
Run Code Online (Sandbox Code Playgroud)