【发布时间】:2013-10-07 19:38:38
【问题描述】:
我正在尝试对英雄(对象)的 nsarray 进行排序。每个英雄都是这样的
@interface Hero : NSObject <NSCoding>
@property (strong,nonatomic) NSString *name;
@property (strong,nonatomic) NSString *correctAnswers;
@property (strong,nonatomic) NSString *falseAnswers;
@property (strong,nonatomic) NSString *bonus;
@property (strong,nonatomic) NSString *level;
-(NSInteger*) inLevel;
+(Hero*) createHero:(NSString*)name
inLevel:(NSString*)level
withBonus:(NSString*)bonus
correctAnswers:(NSString*)correctAnswers
andFalseOnes:(NSString*)falseAnswers;
- (NSString *)description;
@end
为了对这些英雄的数组进行排序,我编写了一个带有两个描述符的排序函数
-(void) sortHeros {
NSSortDescriptor *level = [NSSortDescriptor sortDescriptorWithKey:@"level" ascending:YES comparator:^NSComparisonResult(id a, id b) {
Hero *hero1 = a;
Hero *hero2 = b;
int levelHero1 = [hero1.level intValue];
int levelHero2 = [hero2.level intValue];
if (levelHero1 > levelHero2) {
return (NSComparisonResult)NSOrderedAscending;
} else if (levelHero1 < levelHero2) {
return (NSComparisonResult)NSOrderedDescending;
}
return (NSComparisonResult)NSOrderedSame;
}];
NSSortDescriptor *bonus = [NSSortDescriptor sortDescriptorWithKey:@"bonus" ascending:YES comparator:^NSComparisonResult(id a, id b) {
Hero *hero1 = a;
Hero *hero2 = b;
int bonusHero1 = [hero1.bonus intValue];
int bonusHero2 = [hero2.bonus intValue];
if (bonusHero1 > bonusHero2) {
return (NSComparisonResult)NSOrderedAscending;
} else if (bonusHero1 < bonusHero2) {
return (NSComparisonResult)NSOrderedDescending;
}
return (NSComparisonResult)NSOrderedSame;
}];
NSArray *sortedArray;
sortedArray = [self.heros sortedArrayUsingDescriptors:[NSArray arrayWithObjects:level, bonus, nil]];
self.heros = [sortedArray mutableCopy];
}
不幸的是,当使用
调用 sortedArrayUsingDescriptors 时,它在对 5 个对象的数组进行排序时崩溃 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bonus]: unrecognized selector sent to instance 0x9674520'
我不知道出了什么问题。有人可以指出我的错误吗?
------- 自我解决 ----------- 嘿,感谢您指出解决方案。这是我为其他有同样问题的人提供的正确代码。
@interface Hero ...
-(NSString*) heroBonus;
-(NSString*) heroLevel;
@end
-(void) sortHeros {
NSSortDescriptor *level = [NSSortDescriptor sortDescriptorWithKey:@"heroLevel" ascending:NO comparator:^NSComparisonResult(id a, id b) {
int levelHero1 = [a intValue];
int levelHero2 = [b intValue];
...
}];
NSSortDescriptor *bonus = [NSSortDescriptor sortDescriptorWithKey:@"heroBonus" ascending:NO comparator:^NSComparisonResult(id a, id b) {
int bonusHero1 = [a intValue];
int bonusHero2 = [b intValue];
...
}];
...
}
【问题讨论】:
-
你有一个名为“bonus”的 NSString * 和一个名为“bonus”的 NSSortDescriptor *。也许只有我一个人,但编译器也可能会感到困惑。
-
显示您收到崩溃的确切行。
-
我还将奖金排序描述符的名称更改为 sortBonus 或其他内容
标签: ios objective-c sorting nsarray descriptor