Согласно вашему описанию, highscoredata
- это массив NSDictionary
с. Таким образом, в результате вашего вызова sortedArrayUsingFunction:context
вызывается intSort
для сравнения словарей. Согласно сообщению об ошибке на консоли, NSDictionary
не реализует intValue
.
Чтобы настроить свой код напрямую, попробуйте:
NSInteger intSort(id num1, id num2, void *context) {
// assuming the numerical score is in the dictionary
// under the key 'score'
int v1 = [[num1 objectForKey:@"score"] intValue];
int v2 = [[num2 objectForKey:@"score"] intValue];
...
Таким образом, сравниваются два словаря, извлекая из каждого NSNumber, представляющий счет, и сравнивая его.
NSNumber фактически реализует compare:
для себя, поэтому более компактная версия будет:
NSInteger intSort(id num1, id num2, void *context) {
NSNumber *v1 = [num1 objectForKey:@"score"];
NSNumber *v2 = [num2 objectForKey:@"score"];
return [v1 compare:v2];
}
Основываясь на этом, из-за того, как ключевые пути работают в Objective-C, еще более короткая версия будет:
NSArray *highscoredata = [[NSArray alloc] initWithContentsOfFile:location];
NSSortDescriptor *sortDescriptor =
[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];
self.sortedhighscores = [highscoredata
sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
Нет необходимости в intSort
функции вообще - NSDictionary
знает, как искать что-то с помощью ключевого «счетчика» и что он ищет, это NSNumber
s, которые умеют сравнивать себя.