我在为搜索功能编写谓词时遇到了一些困难,并认为你需要帮助。所以基本上我有两个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?
答案 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}}方法对它们进行比较。但到目前为止提出的基于谓词的解决方案也是如此。