Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Sortieren mit Funktionen

Ein Array mit Hilfe eines Bubblesort in eine neue Reihenfolge zu bringen, ist eine aufwendige und vor allem unnötige Angelegenheit. Bubblesort ist zwar eine feine Sache, und jeder Programmierer sollte wissen wie es funktioniert, doch für solch triviale Vorgänge wie das Sortieren von Zahlen, gibt es Alternativen. Sie können den gesamten Code für die Sortierung durch eine einzige Programmzeile ersetzten.
[zufallsArray sortUsingSelector:@selector(compare:)];
Durch diese Anweisung wird die Array-eigene Sortiermethode aufgerufen, die in Windeseile die mühselige Arbeit des Sortierens für Sie erledigt.
Der Aufruf braucht einen selector, eine Methode, welche die Werte miteinander vergleicht und ein NSComparisonResult zurück gibt. In diesem Fall wollen Sie NSNumber vergleichen, und compare ist auch tatsächlich eine Methode, in der NSNumber-Klasse, mit der man eine NSNumber mit einer anderen vergleichen kann. Der Rest geht dann schon automatisch.
Wenn Sie eigene Klassen schreiben, können Sie auch für diese eigene compare-Methoden implementieren. In dieser Methode bestimmen Sie dann, wie ein Objekt mit einem anderen Objekt gleichen Types verglichen wird, und nach welchen Kriterien ein Objekt größer oder kleiner als ein anderes Objekt ist.
Leider ist NSNumber keine von Ihnen erstellte Klasse, eine weitere Methode für alternative Vergleiche können Sie also nicht so ohne weiteres hinzufügen. Wollen Sie das Array aber auf eine andere Weise sortieren, bietet sich sortUsingFunction an. Hier können Sie explizit eine Funktion angeben, die den Vergleich vornimmt.
[zufallsArray sortUsingFunction:myCompareFunction context:NULL];
Wie Sie die Funktion dann umsetzten, bleibt ganz Ihnen überlassen. Wichtig ist nur, dass Sie verschiedene NSComparisonResult als Rückgabewerte haben.
Folgender Code macht genau das, was sie bereits mit sortUsingSelector erreicht haben: er sortiert das Array aufsteigend. Tauschen Sie hingegen die beiden Werte NSOrderedAscending und NSOrderedDescending gegeneinander, so wird das Array absteigend sortiert. Sie können die Funktion über der Methode lottoSpielen: in Ihren Programmcode einfügen.
NSComparisonResult myCompareFunction(id val1, id val2, void *context)
{
    int nVal1 = [val1 intValue];
    int nVal2 = [val2 intValue];
    if(nVal1 < nVal2)
    {
        return NSOrderedAscending ;
    }
        else if(nVal1 > nVal2)
    {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}
Die Funktion erwartet einen dritten Parameter, einen Context, der bisher nicht benutzt wurde. Mit dem Context können zusätzliche Informationen in die Funktion übergeben werden und auf diese Art lassen sich komplexe Vergleiche erstellen. Der Context kann dabei ein Zeiger auf ein beliebiges Objekt sein, ein NSString zum Beispiel, ist eine gute Möglichkeit den Context zu verwenden.
NSComparisonResult myCompareFunction(id val1, id val2, void *context)
{
    int nVal1 = [val1 intValue];
    int nVal2 = [val2 intValue];

    NSString *order = (__bridge NSString *)(context);

    if([order compare:@"auf"] == NSOrderedSame)
    {
        if(nVal1 < nVal2)
        {
            return NSOrderedAscending;
        }
        else if(nVal1 > nVal2)
        {
            return NSOrderedDescending;
        }
    }
    else
    {
        if(nVal1 < nVal2)
        {
             return NSOrderedDescending;
        }
    else if(nVal1 > nVal2)
   
    {
           return NSOrderedAscending;
        }
    }
    return NSOrderedSame;
}
Versuchen Sie jetzt mal folgende Anweisungen:
[zufallsArray sortUsingFunction:myCompareFunction context:@"ab"];
oder
[zufallsArray sortUsingFunction:myCompareFunction context:@"auf"];