2015-05-15 5 views
2

Если я пытаюсь разобраться BL_Player их playerScore собственности:Проблема сортировки пользовательских объектов в NSArray численно

NSArray *sortedPlayers = [players sortedArrayUsingComparator: ^(BL_Player *a1, BL_Player *a2) { 
           return [a1.playerScore compare:a2.playerScore options:NSNumericSearch]; 

ИЛИ

NSArray *sortedPlayers = [players sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
            NSInteger first = [(BL_Player *)a playerScore]; 
            NSInteger second = [(BL_Player *)b playerScore]; 
            return [first compare:second options:NSNumericSearch]; 
           }]; 

оба из которых возвращают плохих типов приемников. Что не так с выполнением сравнений по ints или NSInteger?

+4

метод сравнения работает для NSNumber, но не для int или NSInteger – Ritu

+0

... поэтому с любыми настройками компилятора, это никогда не должно компилироваться. – gnasher729

ответ

1

Попробуйте один:

NSArray *sortedPlayers = [players sortedArrayUsingComparator: ^(BL_Player *a1, BL_Player *a2) { 

    if (a1.playerScore > a2.playerScore) { 
     return NSOrderedAscending; 
    } 
    else if (a1.playerScore < a2.playerScore) { 
     return NSOrderedDescending; 
    } 
    else 
     return NSOrderedSame; 
} 

Изменение согласно вашему требованию.

Может помочь вам.

+0

Спасибо, это было очень полезно. Теперь я понимаю, что вы не можете использовать сравнение по ints. – Macness

+0

Я изменил его, чтобы использовать 'else' вместо 'else if' из-за блока. – Macness

+0

@Macness, вы не должны этого делать, лучше использовать обновленный. – Revinder

0

Лучший подход, чтобы сделать это:

NSSortDescriptor *sortDescriptor; 
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"playerScore" 
               ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
NSArray *sortedArray; 
sortedArray = [players sortedArrayUsingDescriptors:sortDescriptors]; 

для убывающих изменения порядка YES на NO.

+0

Просто любопытно, как лучше использовать дескриптор, чем блок? – Macness

+0

это лучше, потому что вам не нужно беспокоиться о типе playerScode, будь то NSNumber, NSInteger, int или что-то еще, а также не требует, чтобы вы писали свой собственный компаратор. – Revinder

+1

Это также в несколько раз медленнее. И намного менее гибкий. – gnasher729

Смежные вопросы