开发者

sort NSArray with objects

开发者 https://www.devze.com 2023-03-24 22:20 出处:网络
Supposing NSArray has several objects which belong to two classes, @interface FWNewsObj:NSObject { NSString *newsTitle;

Supposing NSArray has several objects which belong to two classes,

@interface FWNewsObj:NSObject
 {
  NSString *newsTitle;
  NSDate *newsTime;
 }
 @end




@interface FWPhotoObj:NSObject
 {
  NSString *photoTitle;
  NSDate *photoTime;
 }
 @end

I'd like to sort the NSArray with object's title (or time). However the title variable in each class has differ开发者_Python百科ent names.

Then How can I do the sort? Thanks.


What is instantly coming to my mind is(If I am understanding the Q correctly) :

  • 1st create a dictionary, with titleNames as the keys, and value as the objects
  • Sort the keys array simply
  • Then create a sorted array of objects pulling them out of the dictionary, on basis of this sorted keys array


You have to write a custom compare method that both your classes implement. It must take one object as a parameter and return an NSComparisonResult (NSOrderedAscending, NSOrderedDescending or NSOrderedSame)

You can then use sortedArrayUsingSelector: with your own comparison method.

Example:

In FWNewsObj:

- (NSComparisonResult)compareTitle:(id)obj
{
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj);
    if ([obj isKindOfClass:[FWPhotoObj class]]) {
        return [newsTitle compare:[(FWPhotoObj *)obj photoTitle]];
    } else {
        return [newsTitle compare:[(FWNewsObj *)obj newsTitle]];
    }
}

In FWPhotoObj:

- (NSComparisonResult)compareTitle:(id)obj
{
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj);
    if ([obj isKindOfClass:[FWPhotoObj class]]) {
        return [photoTitle compare:[(FWPhotoObj *)obj photoTitle]];
    } else {
        return [photoTitle compare:[(FWNewsObj *)obj newsTitleTitle]];
    }
}

It would actually be easier to just define a title method in both classes that wraps either the photoTitle or the newsTitle. Then you can just use NSSortDescriptor with title as the key.

0

精彩评论

暂无评论...
验证码 换一张
取 消