Try doing

name.#first

as FIRST and LAST are reserved words and need escaping:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html

I just tried:

                NSComparisonPredicate *p = (NSComparisonPredicate 
*)[NSComparisonPredicate predicateWithFormat:@"name.#first == 'Aaron'"];
                                
                NSDictionary *myself = @{@"name": @{@"first" : @"Aaron", 
@"last" : @"Tuller"}};
                NSDictionary *yourself = @{@"name": @{@"first" : @"Jens", 
@"last" : @"Alfke"}};
                
                NSLog(@"%i", [p evaluateWithObject:myself]);
                NSLog(@"%i", [p evaluateWithObject:yourself]);

works as expected.

-aaron


> On Jan 9, 2017, at 6:01 PM, Jens Alfke <j...@mooseyard.com> wrote:
> 
> I’m writing code that walks through an NSPredicate and generates an alternate 
> form of query from it (similar to what CoreData and Realm do.)
> 
> I’m seeing some very weird undocumented behavior when format strings are 
> compiled into NSPredicates, if the format string includes a key-path with a 
> property named “first” or “last”. The resulting predicate contains an 
> NSExpression of an undocumented type.
> 
> - For example, “name.middle == ‘Bob’” compiles to what you’d expect; the LHS 
> of the ‘equals’ predicate is an expression of NSKeyPathExpressionType, with 
> key-path “name.middle”.
> - But “name.first == ‘Bob’” results in an LHS that’s of 
> NSFunctionExpressionType, with a function selector “valueForKeyPath:”, and 
> even weirder, the expression’s argument is an expression with the 
> undocumented expressionType 11. I don’t know what that is supposed to mean, 
> except that its -description is “FIRST” (all caps).
> 
> NSComparisonPredicate
>       predicateOperatorType = NSEqualToPredicateOperatorType
>       leftExpression =
>               NSKeyPathExpression
>                       expressionType = NSFunctionExpressionType
>                       function = “valueForKeyPath:”
>                       operand =
>                               NSKeyPathExpression
>                                       expressionType = NSKeyPathExpressionType
>                                       keyPath = “name”
>                                       operand = SELF
>                       arguments = [
>                               NSSymbolicExpression
>                                       expressionType = 11 (?????)
>                       ]
>       rightExpression =
>               NSExpression
>                       expressionType = NSConstantValueExpressionType
>                       constantValue = @“Bob” 
> 
> Is there something magic about the property name “first”? The only related 
> thing I’ve seen is that in predicate syntax arrays can be indexed with 
> “[FIRST]” or “[LAST]”, but that’s in an array subscript not a keypath…
> 
> —Jens
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/cocoa-dev/mandelbaum%40mac.com
> 
> This email sent to mandelb...@mac.com


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to