2011-08-17 161 views

回答

4

如果你的目标的Mac OS X v10.6中或iOS4的和更高的,你可以使用排序比较类似这种

NSDateFormatter *formatter1 = ...; //create and configure date formatter for Class1 
NSDateFormatter *formatter2 = ...; //create and configure date formatter for Class2 


[arrayOfObjects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSDate *date1 = nil, *date2 = nil; 
    //Get first objects date 
    if([obj1 isKindOfClass:[Class1 class]]) 
    { 
     date1 = [formatter1 dateFromString:[obj1 class1Date]]; 
    } 
    else if([obj1 isKindOfClass:[Class2 class]]) 
    { 
     date1 = [formatter2 dateFromString:[obj1 class2Date]]; 
    } 

    //Get second objects date 
    if([obj2 isKindOfClass:[Class1 class]]) 
    { 
     date2 = [formatter1 dateFromString:[obj2 class1Date]]; 
    } 
    else if([obj2 isKindOfClass:[Class2 class]]) 
    { 
     date2 = [formatter2 dateFromString:[obj2 class2Date]]; 
    } 

    NSAssert(date1 != nil, @"Could not parse date from %@", obj1); 
    NSAssert(date2 != nil, @"Could not parse date from %@", obj2); 

    return [date1 compare:date2]; 
}]; 

除了检查类,你也可以检查它是否给选择响应。

+2

铸造从'id'的对象是完全没有必要。 – Chuck

+0

是的,在NSArray上有几个“sortUsing ...”方法,并且他们中的任何一个都应该完成这项工作。 –

+0

顺便说一句 - 没有必要运行'isKindOfClass:'或'respondsToSelector:'如果你使用类别.. – nielsbot

1

您可以添加一个类别来统一日期字段名称。比方说,A类的实例有一个字段“dateString”和B类的实例有一个字段“creationDateString” ......你可以这样做:

@implementation A (SortByDate) 

-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.dateString ] ; 
} 
@end 

@implementation B (SortByDate) 
-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.creationDateString ] ; 
} 
@end 

现在,您可以将您的阵列中的所有对象通过sortDate属性进行排序:

NSArray * sortedByDateArray = [ unsortedArray sortedArrayUsingComparator:^(id a, id b){ 
    return [ [ a sortDate ] compare:[ b sortDate ] ] ; 
}]; 

编辑或用一种描述:

NSArray * sortedArray = [ unsortedArray sortedArrayUsingDescriptors:[ NSArray arrayWithObject:[ NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:YES ] ] ] ; 
+0

你甚至可以为你的新'sortDate'属性创建每个实例的存储,所以它只需要重新计算底层字符串变化。 – nielsbot

相关问题