【问题标题】:Dynamic comparator in NSPredicateNSPredicate 中的动态比较器
【发布时间】:2015-12-11 19:26:34
【问题描述】:

我想知道有没有办法构建谓词并动态指定要使用的比较器?例如我试过这个,但它崩溃了:

NSPredicate *validPredicate = [NSPredicate predicateWithFormat:@"%K %@ %@", NSStringFromSelector(@selector(expirationDate)), isValid ? @"<" : @">",[NSDate date]];

但如果我在字符串中硬编码比较器,它不会崩溃:

 NSPredicate *validPredicate = [NSPredicate predicateWithFormat:@"%K < %@", NSStringFromSelector(@selector(expirationDate)), [NSDate date]];

有没有比这样做更好的方法:

 NSPredicate * validPredicate = nil;

if (isValid) {
    validPredicate = [NSPredicate predicateWithFormat:@"%K > %@", NSStringFromSelector(@selector(expirationDate)), [NSDate date]];
} else {
    validPredicate = [NSPredicate predicateWithFormat:@"%K < %@", NSStringFromSelector(@selector(expirationDate)), [NSDate date]];
}

【问题讨论】:

    标签: ios nspredicate comparator


    【解决方案1】:

    从技术上讲,执行此操作的正确方法是使用 NSComparisonPredicate 上的初始化程序。使用动态生成的格式字符串可能会起作用,但它很脆弱。

    NSPredicateOperatorType comparison = isValid ? NSGreaterThanPredicateOperatorType : NSLessThanPredicateOperatorType;
    
    NSExpression *expirationDate = [NSExpression expressionForKeyPath:@"expirationDate"];
    NSExpression *date = [NSExpression expressionForConstantValue:[NSDate date]];
    validPredicate = [[NSComparisonPredicate alloc] initWithLeftExpression:expirationDate 
                                                           rightExpression:date 
                                                                  modifier:NSDirectPredicateModifier 
                                                                      type:comparison 
                                                                   options:0];
    

    【讨论】:

      【解决方案2】:

      我不确定为什么解析您的第一个示例时出错,但先构建格式如何:

      NSString *format = [NSString stringWithFormat:@"%%K %@ %%@", isValid ? @"<" : @">"];
      NSPredicate *validPredicate = [NSPredicate predicateWithFormat:format, NSStringFromSelector(@selector(expirationDate)), [NSDate date]];
      

      (它的代码比if 少,但我想这取决于你对“最佳”的定义。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 2015-10-02
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多