1

次の述語を作成しようとしています

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

ここvarNameで、 とvarDateはそれぞれ NSString オブジェクトと NSDate オブジェクトです。変数は次のoperatorように宣言されます。

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

基本的に、述語を作成するときに数行を節約したいと思います。の値に基づいてさまざまな述語を作成できることはわかっていますがdirection、この使用例では考えさせられます。

現在、この現在の方法はクラッシュしているため、可能ではないと思います。他の誰かが運が良かったのだろうかと思っています。

4

4 に答える 4

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

これは、異なる述語文字列の使用に関する 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 に答える
1

フォーマット文字列が提供されたパラメーターと異なるため、それを行うことはできません。フォーマット文字列が処理されて有効で解析可能な述語文字列が生成されるときに、提供されたパラメーターが引用符で囲まれるためです。

于 2013-05-17T20:21:02.040 に答える