2017-03-29 1 views
0

I-Code müssen wie folgt zu sortieren:Was ist der einfachste Weg, um eine NSMutableArray in obj C

-(NSInteger) sortList:(NSMutableArray*)list { 
    if(!list) 
     return -1; 

    //sort list 
    [list sortUsingSelector:@selector(compare:)]; 

    //do other stuff 

} 

Mein Code ständig abstürzt mit *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI sortUsingSelector:]: unrecognized selector sent to instance

Die Liste ist nicht leer und auf jeden Fall einige Elemente enthält. Ich habe also keine Ahnung, warum es zusammenbricht. Ich habe versucht, anstelle dieses Stück Code zum Vergleich

[list sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
      NSNumber *num1 = obj1; 
      NSNumber *num2 = obj2; 

     if([num1 integerValue] <= [num2 integerValue]){ 
       return NSOrderedAscending; 
      } 
     else 
      return NSOrderedDescending; 
    }]; 

Auch stattdessen verwenden stürzt mit dem gleichen Problem. Irgendeine Idee, was ich hier falsch machen könnte?

+4

Das bedeutet, dass Ihr Array ist in der Tat ein * unveränderlich * 'NSArray' ... –

+0

Mögliches Duplikat von http://stackoverflow.com/questions/22570144/baffled-by-nsmutablearray-sortusingdescriptors-exception. –

+1

Ihr Titel stimmt nicht mit Ihrer Frage überein. – Koen

Antwort

1

Dies scheint für mich zu arbeiten, aber es inline nicht sortieren, gibt eher die sortierte Liste:

-(NSArray *) sortList:(NSMutableArray*)list { 

    NSMutableArray *copy = [list mutableCopy]; 

    [copy sortUsingComparator:^NSComparisonResult(id _Nonnull num1, id _Nonnull num2) { 
      if([num1 integerValue] <= [num2 integerValue]){ 
       return NSOrderedAscending; 
      } 
      else 
       return NSOrderedDescending; 

    return copy; 
} 
+2

Gute Idee, um den Param veränderbar zu machen, aber das OP sollte herausfinden, warum der Param, den er für veränderlich hält, manchmal nicht ist. Wenn Sie darüber hinaus wissen, dass Sie eine veränderbare Kopie haben, ist 'responseToSelector: @selector (sortUsingComparator:)' überflüssig. – danh

+1

Auch die 'nil' Prüfung ist überflüssig. – Sulthan

+0

Warum konvertieren 'NSNumber' in' integer' um den Vergleich zu machen, und nicht direkt 'compare:'? 'return [num1 compare: num2]' wenn OP immer noch Komparator verwenden möchte? – Larme

Verwandte Themen