当前位置: 首页 > 科技观察

iOS探秘:SortcustomobjectsinNSArray

时间:2023-03-14 17:07:56 科技观察

本文翻译自HowtosortNSArraywithcustomobjects。我们开发的每一个程序都会用到一些数据,而这些数据一般都封装在一个自定义的类中。例如,音乐程序可能有Song类,聊天程序可能有Friend类,点餐程序可能有Recipe类,等等。有时我们希望程序中显示的列表数据按照一定的顺序排列。在本文中,我们将了解iOS中可以对NSArray中的对象进行排序的方法。下面是目录:小音使用NSComparator排序使用NSDescriptor使用selector排序(nonatomic,copy)NSString*surname;@property(nonatomic,strong)NSDate*dateOfBirth;@end数组包含以下内容:SmithJohn03/01/1984AndersenJane16/03/1979ClarkAnne13/09/1995SmithDavid19/07/1981JohnsonRose22/02/1989使用NSComparator进行比较器排序实际上是使用了一个block对象来进行比较。它的定义如下:typedefNSComparisonResult(^NSComparator)(idobj1,idobj2);上面的参数(obj1,obj2)就是我们要比较的对象。块返回的结果是NSComparisonResult类型来表示两个对象的顺序。对整个数组进行排序,需要用到NSArray的sortArrayUsingComparator:方法,如下代码所示::p2。姓];}];最终的排序结果如下:AndersenJaneClarkAnneJohnsonRoseSmithJohnSmithDavid使用NSDescriptor进行排序排序描述符不仅可以用来对数组进行排序,还可以指定表视图中元素的排序方式,以及CoreData中fetch请求的返回数据为排序。通过排序描述符,可以很方便的对多键数组进行排序。让我们看看如何按姓氏对我们的数组进行排序,然后再按姓名排序:NSSortDescriptor*firstDescriptor=[[NSSortDescriptoralalloc]initWithKey:@"surname"ascending:YES];NSSortDescriptor*secondDescriptor=[[NSSortDescriptoralalloc]initWithKey:@"name"ascending:YES];NSArray*sortDescriptors=[NSArrayarrayWithObjects:firstDescriptor,secondDescriptor,nil];NSArray*sortedArray=[self.personssortedArrayUsingDescriptors:sortDescriptors];上面代码的排序结果如下:AndersenJaneClarkAnneJohnsonRoseSmithDavidSmithJohn使用selector进行排序。您也可以定义自己的方法来比较两个对象,并使用此方法进行数组排序。将比较器消息发送到值中的每个对象,将数组中的另一个对象作为参数。自定义方法的返回结果是这样的:如果对象本身小于参数中的对象,则返回NSOrderedAscending,否则返回NSOrderedDescending,如果相等则返回NSOrderedSame。以下代码显示:-(NSComparisonResult)compare:(Person*)otherPerson{return[self.dateOfBirthcompare:otherPerson.dateOfBirth];}这个方法定义在Person类中,用于对人的生日进行排序。上面介绍的这些方法都是为了同一个事情:对数组进行排序,你可能会想到底该选哪个?当您需要按多个键进行排序时,最简单的方法是使用排序描述符。如果比较方式很复杂,建议在外面使用自己的选择器。Block是iOS4之后引入的一个强大的功能,使用block进行比较可以在不使用任何变量的情况下完成一个简单的比较方法。当然,你也可以定义一个复杂的块来代替选择器。***,其实这里没有标准答案,大家可以按照自己的感觉来:]