我有一个类(来自NSObject
),其中包含:
NSString name
int position
float speed
然后我从这个类创建一个对象的数组(NSMutableArray
)。我想根据'speed'值对数组进行排序,该值为float
。
我最初的float
值为NSNumber
,int
的值为NSInteger
,我成功排序:
[myMutableArray sortUsingFunction:compareSelector context:@selector(position)];
其中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];
}
现在我使用的是int
而不是NSInteger
,上述代码无效。是否有一个更低级的命令,我应该用它来执行排序?谢谢!
答案 0 :(得分:5)
与drawonward相似,我建议在你的班级中添加一个比较方法:
- (NSComparisonResult)compareSpeed:(id)otherObject
{
if ([self speed] > [otherObject speed]) {
return NSOrderedDescending;
} else if ([self speed] < [otherObject speed]) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}
(您可以使用三元运算符if
折叠else if
- else
- test ? trueValue : falseValue
,或者如果speed
是具有{{{的对象1}}方法(例如NSNumber),你可以compare:
。)
然后您可以按
排序return [[self speed] compare:[otherObject speed]];
正如Georg在评论中所建议的那样,您也可以使用[myMutableArray sortUsingSelector:@selector(compareSpeed:)];
来实现目标;如果你的目标是10.6,你也可以使用块和sortUsingComparator:(NSComparator)cmptr
。
答案 1 :(得分:1)
int compareSpeed( id p1 , id p2 , void *unused ) {
return p1->speed > p2->speed ? 1 : p1->speed < p2->speed : -1 : 0;
}
虽然你真的应该把上面的方法变成你的类:
-(int) compareSpeed:(id)inOtherObjectOfSameType {
return self->speed > inOtherObjectOfSameType->speed ? 1 : self->speed < inOtherObjectOfSameType->speed : -1 : 0;
}