我看过这篇文章:How to sort an NSMutableArray of objects by a member of its class, that is an int or float
并且有类似的东西,但我不确定它是如何工作的,并希望得到一些指导。我有一个标记对象数组,其类型为ivar,取值为0,1,2。我想要一个复选框,说明要订购的内容,0,1或2.
我开始尝试用自己的方法做类似的事情:
- (NSComparisonResult)Type:(id)otherObject {
if ([self Type] > [otherObject Type]) {
return NSOrderedAscending;
}
else if ([self Type] < [otherObject Type]) {
return NSOrderedDescending;
}
else {
return NSOrderedSame;
}
}
在我的.h文件中:
NSInteger _type;
@property NSInteger Type;
我收到两个警告: 指针和整数之间的有序比较('id'和NSInteger') 方法 - 未找到类型(返回类型默认为'id')
当我调用sort方法时,我认为我不明白发生了什么。感谢。
答案 0 :(得分:5)
如果你明确指出输入类型是YourObjectType *
(或者你的对象被称为什么)而不是id
,会发生什么?为了完全安全,你应该检查传入对象的类型(因为它可能根本不响应'Type',或者可能返回使用相同选择器的其他东西),所以你最终得到:
- (NSComparisonResult)Type:(YourObjectType *)otherObject {
if(![otherObject isKindOfClass:[YourObjectType class]]) return NSOrderedSame;
if ([self Type] > [otherObject Type]) {
return NSOrderedAscending;
}
else if ([self Type] < [otherObject Type]) {
return NSOrderedDescending;
}
else {
return NSOrderedSame;
}
}
我基本上和高度咖啡因一样猜测,编译器无法正确确定'Type'的返回类型,但我的猜测是因为编译器对传入对象的预测不正确。
解释整个过程:
当你要求NSArray对sortUsingSelector进行排序时,它会应用一些排序算法,要求它能够比较其中的任何两个对象。当它需要比较两个对象时,它会发送你提供的选择器,然后使用你返回的结果 - 所以使用升序/降序你指定两个对象在正确排序时会出现的顺序。
例如,如果您有一个NSArray填充了SillyObjectType类型的对象并且您发出了sortUsingSelector:@selector(compare:)
,那么NSArray将应用一些未指定的排序算法,该算法涉及将选择器compare:
发送到SillyObjectType的实例。每个SillyObjectType都被问到“如果你来到这个其他对象之前,之后或同一个地方?”。它回复NSOrderedAscending,Descending或Same。
在这个地方,ObjC的动态调度提供了一种略微不同的写作方式,而不是用于例如C ++。选择器将被发送到数组中的对象,因此您应该在这些对象上实现它。在每种情况下,正常规则都适用,因此self
将是该类的实例。
答案 1 :(得分:0)
您似乎已将Type
定义为ivar而非属性,因此在otherObject
中无法显示。将其作为财产公开,您的比较应该有效。