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

Cry*_*tal 1 iphone nssortdescriptor

我看到这篇文章:如何通过类的成员对一个NSMutableArray对象进行排序,即int或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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的.h文件中:

NSInteger _type; 
@property NSInteger Type;
Run Code Online (Sandbox Code Playgroud)

我得到两个警告:指针和整数之间的有序比较('id'和NSInteger')方法 - 未找到类型(返回类型默认为'id')

当你调用sort方法时,我不认为我理解发生了什么.谢谢.

Tom*_*mmy 5

如果您明确指出输入类型是YourObjectType *(或者您的对象被调用的)而不是id?为了完全安全,你应该检查传入对象的类型(因为它可能根本不响应'类型',或者可能返回使用相同选择器的其他东西),所以你最终得到:

- (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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我基本上做出与高度咖啡因相同的猜测,即编译器无法正确确定'Type'的返回类型,但我的猜测是因为编译器对传入对象的预测不正确.

解释整个过程:

当你要求NSArray对sortUsingSelector进行排序时,它会应用一些排序算法,要求它能够比较其中的任何两个对象.当它需要比较两个对象时,它会发送你提供的选择器,然后使用你返回的结果 - 所以使用升序/降序你指定两个对象在正确排序时会出现的顺序.

例如,如果您有一个NSArray填充了SillyObjectType类型的对象,并且您发出了一个sortUsingSelector:@selector(compare:)然后NSArray将应用一些未指定的排序算法,该算法涉及将选择器发送compare:到SillyObjectType的实例.每个SillyObjectType都被问到"如果你来到这个其他对象之前,之后或同一个地方?".它回复NSOrderedAscending,Descending或Same.

在这里,ObjC的动态调度提供了一种与您在C++中使用的方式略有不同的编写方式.选择器将被发送到数组中的对象,因此您应该在这些对象上实现它.在每种情况下,正常规则都适用,因此self该类的实例也将适用.