代码之家  ›  专栏  ›  技术社区  ›  rob5408

使用函数或选择器重新定义

  •  6
  • rob5408  · 技术社区  · 14 年前

    我有很多人需要过滤nsmanagedObjects,我希望在最初的fetch中进行过滤,而不是在之后过滤数组。我以前在谓词中使用过选择器,但在获取nsmanagedObjects时从未使用过,例如,我拥有所有员工,然后在nsarray上使用此谓词…

    [NSPredicate predicateWithFormat:@"SELF isKindOfClass:%@", [Boss class]]
    

    …但是现在我想根据对象的不同属性做更多的数学运算。我想我可以做一些像…

    [NSPredicate predicateWithFormat:@"SELF bonusIsAffordable:%f", howMuchMoneyTheCompanyHas];
    

    …Bonusisaffordable:是我的员工课程的一种方法,它会计算我是否能支付给他们奖金。但我得到一个错误…

    Unknown/unsupported comparison predicate operator type cocoa
    

    你知道我搞砸了什么吗?

    3 回复  |  直到 13 年前
        1
  •  13
  •   Barry Wark    14 年前

    可以在nspredicate中执行任意代码 只有 当限定内存中的对象时。在sqlite支持的情况下 NSPersistentStore , the NSPredicate 编译为SQL并在SQLite查询引擎上执行。由于sqlite不知道objective-c,也不知道有任何对象被实例化,所以无法执行任意代码。

    对于内存中的查询(针对集合、内存或原子核心数据存储),请查看 NSExpression ,特别 +[NSExpression expressionForFunction:selectorName:arguments:] +[NSExpression expressionForBlock:arguments:] . 给定这样一个表达式,您可以构建 NSPRD 编程。

        2
  •  15
  •   Daniel    13 年前

    这会变得更容易 Blocks :

    NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    
        return [evaluatedObject isKindOfClass:[Boss class]];
    }];
    
        3
  •  0
  •   TechZen    14 年前

    谓词字符串不告诉谓词对象要做什么。该方法可能返回一个布尔值,但谓词不知道将其与什么进行比较。您还不如给它一个“true”的谓词字符串,并期望它知道如何处理它。

    尝试:

    [NSPredicate predicateWithFormat:@"(SELF bonusIsAffordable:%f)==YES", howMuchMoneyTheCompanyHas];