从字符串创建NSPredicate

use*_*584 4 string iphone nspredicate

我需要从多个值数组中形成一个谓词.所以我认为我最初可以形成一个包含所有值的字符串,然后传递该字符串以在谓词中使用,即

NSString* stringForPredicate  = [[NSString alloc] init];
if (fromDate != nil) {
          stringForPredicate = [stringForPredicate stringByAppendingFormat:@"(Date > %@ AND Date < %@)", fromDate, toDate];
    }
Run Code Online (Sandbox Code Playgroud)

我还有进一步的计算来形成最终的谓词字符串.

现在,我希望谓词使用此字符串.我认为像这样的东西会起作用:

   NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:@"%@",stringForPredicate];
Run Code Online (Sandbox Code Playgroud)

但它没有并抛出异常:

'无法解析格式字符串"%@"'

有没有办法让这项工作成功?

谢谢,

Emp*_*ack 15

stringForPredicate变量实际上包含了FORMAT_STRING.因此,您需要分配该变量来代替format_string,并在此之后传递args,用逗号分隔,就像这样.

NSSring *stringForPredicate = @"(Date > %@ AND Date < %@)";
NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:stringForPredicate, fromDate, toDate];
Run Code Online (Sandbox Code Playgroud)

对于复合谓词:

NSMutableArray *subPredicates = [NSMutableArray array];

if (fromDate != nil) {

    NSPredicate *from_predicate = [NSPredicate predicateWithFormat:@"Date > %@", fromDate];
    [subPredicates addObject:from_predicate];
}

if (toDate != nil) {

    NSPredicate *to_predicate = [NSPredicate predicateWithFormat:@"Date < %@", toDate];
    [subPredicates addObject:to_predicate];
}

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];
Run Code Online (Sandbox Code Playgroud)