写作比较:Objective-C中的方法

时间:2011-06-27 19:39:46

标签: iphone nssortdescriptor

我看过这篇文章: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方法时,我认为我不明白发生了什么。感谢。

2 个答案:

答案 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中无法显示。将其作为财产公开,您的比较应该有效。