NSPredicate为两个NSNumber数组

我有点难以为我的searchfunction写一个谓词,并认为你会帮忙。 所以基本上我有两个NSNumbers数组。 我想我的谓词满足以下条件:

If a number's integerValue in array A matches any integerValue in array B. 

我不想为这个解决scheme使用任何types的循环。 这是我迄今为止

 ANY integerValue == ANY //how do I pass the entire array here and ask for the integerValue of each member? 

ANY操作符将处理该操作。

由于从你的问题来看,在正常谓词的说法中哪个数组是“自我”是有点困难的,所以我会自己写下来:

 NSArray *arrayA = @[@2, @3, @7]; NSArray *arrayB = @[@2, @4, @9]; NSPredicate *pred = [NSPredicate predicateWithFormat: @"ANY %@ IN %@", arrayA, arrayB]; 

由于缺乏“自我”,必须以nil作为对象进行评估,但工作得很好:

 BOOL matched = [pred evaluateWithObject: nil]; 

如果你想在谓词中有一个“自我”,你可以直接input:

 NSPredicate *pred = [NSPredicate predicateWithFormat: @"ANY self IN %@", arrayB]; BOOL matched = [pred evaluateWithObject: arrayA]; 

结果是一样的。

一个小概念评论

如果在两个数组中都包含任何整数,则上面的谓词的计算结果为true,这就是我如何读取您的问题。

这就是说,从概念上讲,你似乎在testing两组数字是否相互交叉。 NSSet的方法intersectsSet:检查,所以另一种做testing的方法是保持你的数字为集合并testing相交:

 matched = [setA intersectsSet: setB]; 

我知道这不是你要求的(谓词和所有),但另一种方法是使用NSArray- (id) firstObjectCommonWithArray:(NSArray *)otherArray ,如果没有find任何公共对象,将返回nil

 BOOL arraysIntersect = [array1 firstObjectCommonWithArray:array2] != nil; 

有一点需要注意的是,在比较两个对象的时候会使用自己的对象相等性规则,这意味着如果两个对象是NSNumber实例,它将使用NSNumbercompare:方法compare: 。 但是迄今为止提出的基于谓词的解决scheme也是如此。