我有以下 NSArray :

NSArray myArray = @[@{@300:@"5 min"},
                    @{@900:@"15 min"},
                    @{@1800:@"30 min"},
                    @{@3600:@"1 hour"}];

我想要我的字典的值(value)列表:
@[@"5 min",@"15 min",@"30 min",@"1 hour"]

以及我的字典键列表:
@[@300, @900, @1800, @3600]

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

最佳答案

如果没有一些代码来显示您想如何解决这个问题,就很难确定您到底在追求什么,并且这个问题有点困惑。

首先,谓词正是这样——一个可以被证明为真或假的陈述。因此,谓词用于逻辑表达式,包括那些隐式用于数据库查询的表达式——例如 Core Data。

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

很公平。

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

弄清楚了这一点后,使用 KVC,您可以做自己想做的事,而且大惊小怪。它是这样的:

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

NSArray *keys   = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];

一个简短的解释可能是为了:

我们想要的结果是
  • 每个字典的所有值(或键),获取值(或键)数组的数组
  • 然后我们想将这些数组扁平化为一个数组。

  • 要使用 KVC 从字典中获取所有值(或键),特殊键分别是 @allValues@allKeys
    @unionOfArrays 运算符对从它后面的表达式获得的数组进行联合,即,将其展平为您想要的数组。

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

    关于objective-c - 获取 NSDictionary 的 NSArray 的值列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18442443/

    10-12 03:37