2017-12-25 23 views
0

Bitte helfen. Ich habe NSArray mit benutzerdefinierten Objekten darin. Zum Beispiel Person, also sollte die Person mit dem Namen 'Mark' immer am Ende sein. Ist es möglich, dies mit Hilfe von 'sortUsingFunction' zu tun? ich so etwas denke, hier ist eine Art Funktion:NSArray sortUsingFunction benutzerdefinierte Objekt immer am Ende

static NSInteger compareFunction(id item1, id item2, void *context) 
{ 
    Person *pItem1 = (Person *)item1; 
    Person *pItem2 = (Person *)item2; 

    if ([pItem1.name isEqual:@"Mark"]) 
    { 
     return NSOrderedDescending; 
    } 
} 

Hinweis: sollte es sortUsingFunction, keine anderen Funktionen sein.

Antwort

0

Ja, Ihre Idee ist machbar. Hier ist ein getestetes Beispiel:

NSArray *names = @[@"John",@"Mark",@"Sandy"]; 
NSArray *markEndArray = [names sortedArrayUsingComparator:^NSComparisonResult(NSString *_Nonnull obj1, NSString *_Nonnull obj2) { 
    if ([obj1 isEqualToString:@"Mark"]) { 
     return NSOrderedDescending; 
    } 

    return [obj1 compare:obj2]; 
}]; 

NSLog(@"%@",markEndArray); 

//Output:  
    John, 
    Sandy, 
    Mark 
0

Yun CHEN Version funktioniert nicht vollständig. Der Versuch, mit den folgenden Namen es nicht:

NSArray *names = @[ 
    @"John", 
    @"Noah", 
    @"Liam", 
    @"Mason", 
    @"Jacob", 
    @"William", 
    @"Ethan", 
    @"James", 
    @"Alexander", 
    @"Michael", 
    @"Mark", 
    @"Benjamin", 
    @"Elijah", 
    @"Daniel", 
    @"Aiden", 
    @"Logan", 
    @"Matthew", 
    @"Lucas", 
    @"Jackson", 
    @"David", 
    @"Oliver", 
    @"Jayden", 
    @"Sandy" 
]; 

Wrong Ergebnis:

Aiden, 
Alexander, 
Benjamin, 
Daniel, 
David, 
Elijah, 
Ethan, 
Jackson, 
Jacob, 
James, 
Jayden, 
John, 
Liam, 
Logan, 
Lucas, 
Matthew, 
Oliver, 
Sandy, 
Mark, 
Mason, 
Michael, 
Noah, 
William 

Sie haben es so zu erweitern:

NSArray *markEndArray = [names sortedArrayUsingComparator:^NSComparisonResult(NSString *_Nonnull obj1, NSString *_Nonnull obj2) { 
    if ([obj1 isEqualToString:@"Mark"]) { 
     return NSOrderedDescending; 
    } else if ([obj2 isEqualToString:@"Mark"]) { 
     return NSOrderedAscending; 
    } else { 
     return [obj1 compare:obj2]; 
    } 
}]; 

Dann sollte es völlig in Ordnung sein!

Verwandte Themen