首页 > 解决方案 > 使用描述符对 NSArray 进行排序

问题描述

我有两个数组,我想按名称和别名打印值。它们是 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.

标签: arraysobjective-csorting

解决方案


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

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

当你使用 时-sortedArrayUsingDescriptors:NSArray使用你给它的键从它比较的对象中获取值,以决定如何对对象进行排序。如果它不能从第一个描述符确定顺序(因为对象返回的值相同),它会继续下一个描述符,直到它确定顺序或用完描述符。

因此,当您对数组进行排序时,NSArray从第一个键开始,即@"name". 如果您的VBAnimal类不符合 KVC 的 key @"name",那么您将收到上述错误。对于给定的键,至少有三种实现键值编码的方法:

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

你需要为你的VBAnimal班级做这两个中的一个。


推荐阅读