使用描述符对NSArray进行排序

时间:2019-02-05 19:11:34

标签: arrays objective-c sorting

我有两个数组,我想按名称和别名打印值。 它们是NSString值。

我是obj-c的初学者。 我将很高兴为您提供任何帮助。

我将添加您需要了解问题原因的所有内容,谢谢!

NSArray <VBHuman*> * arrayOfHumans = [NSArray arrayWithObjects:
                          human, cycler, runner, swimmer, boxer,
                          nil];

NSArray <VBAnimal*> * arrayOfAnimals = [NSArray arrayWithObjects:
                           animal, dog, cat, hamster,
                           nil];

NSArray* newArray = @[];
newArray = [newArray arrayByAddingObjectsFromArray:arrayOfHumans];
newArray = [newArray arrayByAddingObjectsFromArray:arrayOfAnimals];


[newArray sortedArrayUsingDescriptors:
 @[
   [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES],
   [NSSortDescriptor sortDescriptorWithKey:@"alias" ascending:YES]
   ]];

结果不起作用,其类型如下:

[<VBAnimal 0x6000002520f0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.

1 个答案:

答案 0 :(得分:1)

错误消息告诉您出了什么问题:

  

[<VBAnimal 0x6000002520f0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.

使用-sortedArrayUsingDescriptors:时,NSArray使用您提供的键从要比较的对象中获取值,以决定如何排序对象。如果无法确定第一个描述符的顺序(因为对象返回的值相同),它将继续使用下一个描述符,直到确定顺序或描述符用完为止。

因此,当您对数组进行排序时,NSArray以第一个键(即@"name")开头。如果您的VBAnimal类不支持键@"name"的KVC,那么您将得到上面的错误。至少有三种方法可以为给定密钥实现键值编码:

  • 提供一个名称与键匹配的方法,并使其返回值
  • 添加名称与键匹配的属性
  • 实现valueForKey:,使其返回键的值

您需要为VBAnimal类做这两个操作之一。