你必须编写一个自定义比较方法,这两个类都可以实现。它必须把一个对象作为参数,并返回一个NSComparisonResult
(NSOrderedAscending
,NSOrderedDescending
或NSOrderedSame
)
然后,您可以使用sortedArrayUsingSelector:
用自己的比较方法。
实施例:
在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]];
}
}
在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]];
}
}
它实际上是比较容易在一个包装要么photoTitle或两个类只定义了一个标题的方法newsTitle。那么你可以使用NSSortDescriptor
和title
作为关键。
来源
2011-08-04 02:24:00
omz
两个类都实现了同一个选择的依据是什么?但是选择器的参数是类实例。然后它会导致崩溃,因为newsObj会调用FWPhotoObj的方法。或者可能是我错了,你可以说更多的细节和样本更好。 – scorpiozj
我已经添加了一个例子。由于参数的类型为'id',它可以是FWPhotoObj或FWNewsObj(或任何其他),您必须根据其类来决定如何比较它。 – omz
你是对的。我在类中设置了一个同名的属性。基本上这不是一个问题,因为我认为它可以通过课程设计来避免。 – scorpiozj