我需要从多个值数组中形成谓词。所以我认为我最初可以形成一个包含所有值的字符串,然后传递该字符串以在谓词中使用,即
NSString* stringForPredicate = [[NSString alloc] init];
if (fromDate != nil) {
stringForPredicate = [stringForPredicate stringByAppendingFormat:@"(Date > %@ AND Date < %@)", fromDate, toDate];
}
我还有进一步的计算来形成最终的谓词字符串。
现在,我希望谓词使用此字符串。我认为这样的事情会起作用:
NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:@"%@",stringForPredicate];
但它没有并抛出异常:
'无法解析格式字符串“%@”'
我有办法让这项工作成功吗?
感谢,
答案 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]];
格式字符串摘要
区分之间很重要 a中不同类型的价值 格式字符串。另请注意单身 或双引号变量(或 替换变量字符串)将 导致%@,%K或$变量 解释为格式的文字 字符串等将阻止任何 取代
试试这个
stringForPredicate = [stringForPredicate stringByAppendingFormat:@"(Date > %@) AND (Date < %@)", fromDate, toDate];
答案 2 :(得分:0)
对于使用swift的人:
let predicate = NSPredicate.init("Date > %@ AND Date < %@", fromDate, toDate);