获取NSDictionary的NSArray的值列表

Tho*_*ard 4 objective-c nsdictionary nsarray nspredicate

我有以下NSArray:

NSArray myArray = @[@{@300:@"5 min"},
                    @{@900:@"15 min"},
                    @{@1800:@"30 min"},
                    @{@3600:@"1 hour"}];
Run Code Online (Sandbox Code Playgroud)

我想要我的词典的价值列表:

@[@"5 min",@"15 min",@"30 min",@"1 hour"]
Run Code Online (Sandbox Code Playgroud)

我的词典的关键列表:

@[@300, @900, @1800, @3600]
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?我在考虑谓词,但我不知道如何使用它?

Mon*_*olo 9

如果没有一些代码来展示你想要如何解决这个问题,很难确定你究竟是在做什么,而且这个问题有点混乱.

首先,谓词就是这样 - 一个可以证明是真或假的陈述.因此,谓词在逻辑表达式中使用,包括在数据库查询中隐式使用的那些 - 例如核心数据.

如果我正确地阅读了您的问题,那不是您想要的.你想要的是降低数据模型的复杂性,去除过程中的一些过剩(人们希望)的信息.一种字典数组的扁平化.

很公平.

我还可以看到与谓词的混淆是如何产生的 - 它们通常是使用键值编码构建的.众所周知,KVC是一种非常强大的技术,可以完成你所追求的目标.它与逻辑语句没有太大关系.

通过KVC解决了这个问题,你可以做你想做的事情,并且尽量小心.它是这样的:

NSArray *values = [myArray valueForKeyPath: @"@unionOfArrays.@allValues"];

NSArray *keys   = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];
Run Code Online (Sandbox Code Playgroud)

可能会有一个简短的解释:

我们想要的结果是

  1. 每个字典的所有值(或键),获取值数组(或键)的数组
  2. 然后我们想将这些数组展平为一个数组.

要使用KVC从字典中获取所有值(或键),特殊键分别为@allValues@allKeys.

@unionOfArrays操作者使从跟随它,即,变平成你想要的阵列的表达所获得的阵列的联合.

为简单编码而付出的代价是,您必须将KVC密钥路径与集合运算符一起使用,集合运算符只是代码中的字符串.因此,您失去了编译器的任何语法帮助,并且它不会检查您输入的键是否存在于对象中.同样,如果错误输入或使用错误的运算符,调试器和错误消息也无济于事.