NSPredicate两个NSNumber阵列

时间:2013-06-17 15:00:50

标签: ios objective-c nspredicate

我在为搜索功能编写谓词时遇到了一些困难,并认为你需要帮助。所以基本上我有两个NSNumbers阵列。我希望我的谓词满足以下条件:

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

我不想为此解决方案使用任何类型的循环。这是我到目前为止所拥有的

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

2 个答案:

答案 0 :(得分:5)

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];

如果您希望在谓词中使用“self”,则只需输入它:

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

结果是一样的。

小概念评论

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

这意味着,从概念上讲,您似乎在测试两组数字是否相互交叉。 NSSet的方法intersectsSet:会检查,所以进行测试的另一种方法是将数字保存为集合并测试交集:

matched = [setA intersectsSet: setB];

答案 1 :(得分:0)

我知道这并不是你要求的(谓词和所有),但另一种方法是使用NSArray的{​​{1}},如果没有共同的对象可以返回- (id) firstObjectCommonWithArray:(NSArray *)otherArray找到。

nil

但有一点需要注意的是,在比较两个对象时它会使用自己的对象相等规则,这意味着如果两个对象是NSNumber实例,它将使用BOOL arraysIntersect = [array1 firstObjectCommonWithArray:array2] != nil; 的{​​{1}}方法对它们进行比较。但到目前为止提出的基于谓词的解决方案也是如此。