3

我目前正在尝试自学Objective-C,并且正在玩一个需要对数组进行排序的练习。

我设法使用以下代码完成它:

NSSortDescriptor * newSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE];
NSArray *sortDescriptors = [NSArray arrayWithObject:newSortDescriptor];
[self.theBookStore sortUsingDescriptors:sortDescriptors];

我的问题是关于这里实际发生的事情。我真的不明白我做了什么。

第 1 行:我知道我在这里创建了一个具有描述符的新对象。这有两个参数,我要排序的列和它是升序的。

第2行:这是我感到困惑的行。为什么我需要一个排序描述符数组?当我阅读这段代码时,我怀疑它创建了一个只有一行的数组,对吗?

第 3 行:我知道这是调用 sortUsingDescriptors 方法,但我的困惑是为什么这个函数需要一个数组。

我已经阅读了文档,但我真的在寻找一个简单的解释。

任何帮助深表感谢

4

3 回答 3

5

第 1 行:我知道我在这里创建了一个具有描述符的新对象。这有两个参数,我要排序的列和它是升序的。

实际上,您已经创建了一个描述符对象。它描述了如何对数组进行排序。

第2行:这是我感到困惑的行。为什么我需要一个排序描述符数组?当我阅读这段代码时,我怀疑它创建了一个只有一行的数组,对吗?

对——您已经创建了一个包含单个对象的数组。如果您真的想对那么多字段进行排序,您可以创建一个包含十个、十五个或八十七个排序描述符的数组。更常见的是,你使用一、二,也许是三。因此,如果要对人员列表进行排序,则可以添加指定姓氏和名字的排序描述符。这样,具有相同姓氏的人将根据他们的名字排列在该组中。

第 3 行:我知道这是调用 sortUsingDescriptors 方法,但我的困惑是为什么这个函数需要一个数组。

同样,这样您就可以拥有主要、次要、三级(等)排序键。当您只想对一个键进行排序时,您可以有一个单独的方法,该方法采用单个排序描述符而不是数组。NSArray 不提供,但如果需要,您可以随时将其添加到类别中:

@category NSArray (SingleSortDescriptor)

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor;

@end

@implementation NSArray (SingleSortDescriptor)

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor
{
    return [self sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
}

@end
于 2012-04-13T14:55:31.990 回答
2
  • 第 1 行:.. 是的,您的权利。您正在创建一个名为NSSortDescriptor. 该对象定义了一个要排序的属性。您确实输入了“标题”。因此,要排序的数组中的对象将在该属性之后排序(yourObject.title “kind-of”)。

  • 第 2 行:因为排序方法 ( sortUsingDescriptors) 总是需要一个数组,所以您需要创建一个只有一个对象的 NSArray。好吧,...看起来有点愚蠢。但绝对有道理。假设您想按照两个标准进行排序(比如说“标题”,然后是“城市”)。

  • 第 3 行:是的 heres 必须是一个数组,因为在多个条件之后进行排序。

并始终保持内存清洁:在第 1 行,您确实分配/初始化了 NSSortDescriptor。所以在使用后清理(如果你不使用ARC)。所以添加一行:

[newSortDescriptor release];
于 2012-04-13T14:47:50.590 回答
1

如果有多个匹配项,将使用多个排序描述符来解决发生的情况。我是优先顺序。如果发现两个标题相同,第二个描述符会告诉它该怎么做。

于 2012-04-13T14:49:09.510 回答