2011-05-06 146 views
4

我需要从多个值数组构成一个谓词。所以我想我最初可与所有值的字符串,然后传递字符串在谓语使用,即从字符串创建NSPredicate

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

有进一步的计算,我这样做,形成最终的谓语字符串。

现在,我想谓词使用这个字符串。我认为,像这样的工作:

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

但它不并抛出异常:

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

有没有一种方法可以让我做这个工作?

谢谢,

回答

15

stringForPredicate变量实际上包含了FORMAT_STRING。因此,您需要分配该变量来代替format_string,然后通过参数,然后用逗号分隔,就像这样。

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

嗯,我明白了,但上述声明只是我正在做的变量替换之一。事实上,我正在循环一个数组,并根据特定的条件,我将谓词字符串附加值。所以,我需要一种方法,让我可以使用字符串,或者继续向现有的谓词附加条件,在这种情况下,我可以直接在循环内部使用谓词,而不是使用字符串。有任何想法吗?谢谢。 – user542584 2011-05-06 10:08:58

+0

@ user542584:是的。您可以使用* NSCompoundPredicate *。 – EmptyStack 2011-05-06 10:18:00

+0

@ user542584:我编辑了我的答案。 – EmptyStack 2011-05-06 10:28:13

0

不会这样做吗?

NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:stringForPredicate]; 

,或者你必须这样做

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

reference documents

格式字符串摘要

不同类型的值来区分是很重要的在 格式字符串。还要注意的是单 或双引号变量(或 替代变量字符串)将 事业%@,%K,或$变量被 解释为文本格式 字符串,因此将阻止任何 替代。

试试这个

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

:(没有,这两种选择似乎并没有工作 – user542584 2011-05-06 10:06:33

+0

没有ü注意到这一点在我更新的答案中**还要注意单引号或双引号变量(或替换变量字符串)将导致%@,%K或$变量为b e被解释为格式字符串中的文字,因此将阻止任何替换。** – visakh7 2011-05-06 10:08:55

+0

嗨,是的,我尝试了许多可能的组合,有和没有引号,使用$等。它只是不喜欢我的数据已包含在格式字符串中。在进一步阅读之后,我想我必须使用复合谓词 - 并且形成各个谓词对象而不是字符串对象 - 然后将它们组合在一起。请让我知道,如果你有任何其他的想法。 – user542584 2011-05-06 10:28:15

0

对于使用快捷:

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