Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用NSString编写的表达式查询NSDictionary?_Ios_Objective C - Fatal编程技术网

Ios 如何使用NSString编写的表达式查询NSDictionary?

Ios 如何使用NSString编写的表达式查询NSDictionary?,ios,objective-c,Ios,Objective C,我希望能够运行名为evaluateExpression:on:的假设函数,并得到“John”作为答案 NSDictionary *dict = @{"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]}; NSString *expression = @"response['result'][0]['name']"; NSString *answer = [self evaluateExpression: expression on: dic

我希望能够运行名为
evaluateExpression:on:
的假设函数,并得到“John”作为答案

NSDictionary *dict = @{"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *expression = @"response['result'][0]['name']";
NSString *answer = [self evaluateExpression: expression on: dict];

这可能吗?

有一个NSObject类别,它扩展了
valueForKeyPath
以提供
valueForKeyPath和索引。它让你写下:

NSDictionary *dict = @{@"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *path = @"result[0].name";
NSString *answer = [dict valueForKeyPathWithIndexes:path];
XCTAssertEqualStrings(answer, @"John");
该类别按psy分类,如下所示:

普通的老
valueForKeyPath
会让你接近,但并不完全是你想要的。但在以下形式中可能有用:

NSDictionary *dict = @{@"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *path = @"result.name";
NSString *answer = [dict valueForKeyPath:path];
XCTAssertEqualObjects(answer, (@[@"John", @"Mary"]));

在花了相当长的时间试图以最有效的方式解决这个问题之后,我想到了另一个方法:使用javascript


Ewan发布的上述方法确实解决了这个问题,但我想添加一些额外的自定义特性,objective-c方法很快变得太复杂了。最后,我用javascript编写了
eval
代码,并使用JavascriptCore将其集成到objective-c中。有了它,它就变得像一行
eval()
调用一样简单。

阅读有关键值编码的内容。我不明白为什么会被否决。如果你认为这是一件小事,出来留下一个答案,就像下面那个人回答的那样,这不是一件小事,不是我。其他人,非常感谢!正如我所猜测的,没有简单的解决方法,但是这个解决方案看起来是可行的!
NSDictionary *dict = @{@"result": @[@{@"name": @"John"}, @{@"name": @"Mary"}]};
NSString *path = @"result.name";
NSString *answer = [dict valueForKeyPath:path];
XCTAssertEqualObjects(answer, (@[@"John", @"Mary"]));