如何通过其类的成员(即int或float)对NSMutableArray对象进行排序

J. *_*ave 4 sorting objective-c nsmutablearray

我有一个类(from NSObject)包含:

NSString name
int      position
float    speed
Run Code Online (Sandbox Code Playgroud)

然后我NSMutableArray从这个类创建一个对象的数组().我想通过'speed'值对数组进行排序,这是一个float.

我最初的float值是as NSNumberintas NSInteger,并且我成功排序:

[myMutableArray sortUsingFunction:compareSelector context:@selector(position)];
Run Code Online (Sandbox Code Playgroud)

myMutableArray我的对象数组在哪里.

这是功能:

static int compareSelector(id p1, id p2, void *context) {
    SEL methodSelector = (SEL)context;
    id value1 = [p1 performSelector:methodSelector];
    id value2 = [p2 performSelector:methodSelector];
    return [value1 compare:value2];
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用int而不是NSInteger,上面的代码不起作用.是否有一个更低级的命令,我应该用它来执行排序?谢谢!

Isa*_*aac 5

与drawingonward类似,我建议在你的类中添加一个比较方法:

- (NSComparisonResult)compareSpeed:(id)otherObject
{
    if ([self speed] > [otherObject speed]) {
        return NSOrderedDescending;
    } else if ([self speed] < [otherObject speed]) {
        return NSOrderedAscending;
    } else {
        return NSOrderedSame;
    }
}
Run Code Online (Sandbox Code Playgroud)

(你可以使用三元运算符崩溃if- else if- 或者如果是带有方法的对象(例如NSNumber),你可以.)elsetest ? trueValue : falseValuespeedcompare:return [[self speed] compare:[otherObject speed]];

然后你可以排序

[myMutableArray sortUsingSelector:@selector(compareSpeed:)];
Run Code Online (Sandbox Code Playgroud)

正如Georg在评论中所建议的那样,您也可以使用NSSortDescriptor; 如果你的目标是10.6,你也可以使用块和sortUsingComparator:(NSComparator)cmptr.