我尝试动态生成NSPredicate的字符串
这项工作非常完美:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@" %K MATCHES[cd] %@", sKey, sLookForString];
但这次崩溃错误“'无法解析格式字符串”%K%@ [cd]%@“'”:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@" %K %@[cd] %@", sKey, @"MATCHES", sLookForString];
那么,如何使用“MATCHES”动态构建字符串?
答案 0 :(得分:2)
问题是predicateWithFormat:
不会让你动态地形成动词(语法很清楚)。因此,在您预先形成谓词字符串时动态地形成动词。像这样:
NSString* verb = @"MATCHES"; // or whatever the verb is to be
NSString* s = [NSString stringWithFormat: @" %%K %@[cd] %%@", verb];
NSPredicate * predicate = [NSPredicate predicateWithFormat:s, sKey, sLookForString];
或者使用NSExpression
和NSComparisonPredicate
(以及,如果需要,NSCompoundPredicate
)在代码中完全动态地形成谓词,而不使用格式字符串。这往往是一种更好的方式;对于最简单的案例,stringWithFormat:
实际上只是一种便利。例如:
NSExpression* eKey = [NSExpression expressionForKeyPath:sKey];
NSExpression* eLookForString = [NSExpression expressionForConstantValue:sLookForString];
NSPredicateOperatorType operator = NSMatchesPredicateOperatorType;
NSComparisonPredicateOptions opts =
NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption;
NSPredicate* pred =
[NSComparisonPredicate
predicateWithLeftExpression:eKey
rightExpression:eLookForString
modifier:0
type:operator options:opts];