从字符串创建NSPredicate

时间:2011-05-06 08:37:56

标签: iphone string nspredicate

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

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

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

现在,我希望谓词使用此字符串。我认为这样的事情会起作用:

   NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:@"%@",stringForPredicate];

但它没有并抛出异常:

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

我有办法让这项工作成功吗?

感谢,

3 个答案:

答案 0 :(得分:15)

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

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

对于复合谓词:

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];

答案 1 :(得分:0)

不这样做吗?

  NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:stringForPredicate];

或者你必须这样做

NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@",stringForPredicate]];

来自reference documents

  

格式字符串摘要

     

区分之间很重要   a中不同类型的价值   格式字符串。另请注意单身   或双引号变量(或   替换变量字符串)将   导致%@,%K或$变量   解释为格式的文字   字符串等将阻止任何   取代

试试这个

stringForPredicate = [stringForPredicate stringByAppendingFormat:@"(Date > %@) AND (Date < %@)", fromDate, toDate];

答案 2 :(得分:0)

对于使用swift的人:

let predicate = NSPredicate.init("Date > %@ AND Date < %@", fromDate, toDate);