1

我正在尝试创建以下谓词

[NSPredicate predicateWithFormat:@"name != %@ AND date %@ %@", varName, operator, varDate]

其中varNamevarDate分别是 NSString 和 NSDate 对象。operator变量声明如下:

NSString *operator = (direction == kPageDirectionForward) ? @">" : @"<";

基本上我想在创建谓词时保存几行。我知道我可以根据 的值创建不同的谓词direction,但是这个用例让我思考。

现在这个当前的方法崩溃了,所以我认为它不可能。我想知道是否还有其他人有运气。

4

4 回答 4

2

我意识到这与 op 关于使用不同谓词字符串的声明没有根本不同,但您可以动态构建谓词字符串:

NSString *operator = (direction == kPageDirectionForward) ? @">" : @"<";

NSMutableString * predicateString = [NSMutableString stringWithString: @"name != %@ AND date "];
[predicateString appendString: operator];
[predicateString appendString: @" %@"];
[NSPredicate predicateWithFormat: predicateString, varName, varDate];
// should return valid predicate: @"name != %@ AND date < %@"

作为一个稍微奇怪的例子,只要您查询 nsobjects,这应该可以工作:

NSString * predicateString = [NSString stringWithFormat: @"name != %@ AND date %@ %@", @"%@", operator, @"%@"];
[NSPredicate predicateWithFormat: predicateString, varName, varDate];
于 2013-09-11T22:19:01.253 回答
2

NSComparisonPredicate您可以通过和的组合来实现这一点NSCompoundPredicate

// First part: name != <varName>
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"name != %@", varName];

// Second part: date <op> <varDate>
NSExpression *lexp = [NSExpression expressionForKeyPath:@"date"];
NSExpression *rexp = [NSExpression expressionForConstantValue:varDate];
NSPredicateOperatorType op = (direction == kPageDirectionForward) ? NSGreaterThanPredicateOperatorType : NSLessThanOrEqualToPredicateOperatorType;
NSPredicate *p2 = [NSComparisonPredicate predicateWithLeftExpression:lexp
                                                     rightExpression:rexp
                                                            modifier:0
                                                                type:op
                                                             options:0];
// predicate = <p1> AND <p2>
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2]];
于 2013-05-17T20:28:34.827 回答
2

确实有一种更有效的方法可以做到这一点:

NSString *dateOperator = (direction == kPageDirectionForward) ? @">" : @"<";
NSString *stringPredicate=[NSString stringWithFormat:@"%%K != %%@ AND %%K %@ %%@", dateOperator];

NSPredicate *yourPredicate=[NSPredicate stringPredicate argumentArray:@[@"name",varName,@"date",varDate]];
于 2016-05-24T15:47:42.043 回答
1

您不能这样做,因为格式字符串与提供的参数不同,因为在处理格式字符串以生成有效且可解析的谓词字符串时,提供的参数将被引用。

于 2013-05-17T20:21:02.040 回答