在两个属性上对NSArray进行排序 - int和date

时间:2012-05-03 14:42:07

标签: ios sorting nsarray

再次从N00B土地注意到。我已经阅读了很多关于排序数组的内容 - 想尝试使用块方法,但是还没有把它包裹起来。相反,我选择了描述符方法。我在其他人的oodles和oodles中读到了这个Sort NSArray of custom objects by their NSDate propertiesHow to sort an NSMutableArray with custom objects in it?。在我的代码中,我这样做了:

NSString *lastHighScore = @"_highScore";
NSString *dateScoreCreated = @"_dateCreated";
NSSortDescriptor *highScoreDescriptor = [[[NSSortDescriptor alloc]
    initWithKey:lastHighScore                                        
    ascending:NO                                          
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];

NSSortDescriptor *dateScoreCreatedDescriptor = [[[NSSortDescriptor alloc]
                                      initWithKey:dateScoreCreated
                                      ascending:NO
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *descriptors = [NSArray arrayWithObjects:highScoreDescriptor, 
dateScoreCreatedDescriptor, nil];

NSArray *sortedArray = [[[FlipHighScoreStore sharedStore] allHighScores] sortedArrayUsingDescriptors:descriptors];

可悲的是,我开始时遇到错误 - initializer元素不是编译时元素。我查了一下并试着设置NSSortDescriptor *highScoreDescriptor = nil然后我得到一个警告,说highScoreDescriptor“Type Specifier Missing,默认为int”,在这种情况下是好的,但对于下一个描述符中的Date对象不太好。 (原来我也得到一个错误,说我正在重新定义不同类型的highSoreDescriptor。)

此外,有哪些选择器可用的列表?我怀疑localizedCaseInsensitiveCompare:是我想要使用的,因为第一个属性“_highScore”是一个int而第二个“_dateCreated”是一个日期。我读到某处默认是“比较”,所以我可以把“比较:”? (找到一个答案,我认为 - 我可以使用(intValue)作为第一个描述符:

selector:@selector(intValue)] autorelease];

更多的阅读让我觉得我可以完全取消日期排序的选择线。这是对的吗?

最后,如果我说ascending:NO与降序相同?我猜它是,但是人们从不知道编程,是吗?

我是否将所有这些代码包装在自己的方法中?或者我可以(直到后来)将它插入到我正在布置表格的代码中?

这个项目不是ARC。

1 个答案:

答案 0 :(得分:1)

要回答我自己的问题,在朋友的帮助下,我基本上做了两件事。首先,我在一个方法之外编写代码 - 这就是我得到初始化元素的所有错误的原因。当我添加这个时,我想我很累。

至于实际的排序,我从描述符描述中删除了选择器选项,实际发生了排序!

最后,是的,ascending:NO等于降序。

最后一点,必须等到我准备好解决应用程序的更多重构。