2012-04-13 11 views
3

Ich versuche gerade, mir Objective-C beizubringen und spielte mit einer Übung herum, bei der ich ein Array sortieren musste.Sortierung von Arrays in Objective-C

ich es geschafft, es zu vollenden mit dem folgenden Code:

NSSortDescriptor * newSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:newSortDescriptor]; 
[self.theBookStore sortUsingDescriptors:sortDescriptors]; 

Meine Frage ist, was hier eigentlich passiert. Ich verstehe nicht genau, was ich getan habe.

Zeile 1: Ich verstehe hier Ich habe ein neues Objekt erstellt, das einen Deskriptor hat. Dies hat zwei Parameter, die Spalte, nach der ich sortieren möchte und die aufsteigend ist.

Zeile 2: Das ist die Zeile, über die ich verwirrt bin. Warum brauche ich ein Array von Sortierdeskriptoren? Wenn ich diesen Code lese, vermute ich, dass er ein Array mit nur einer Zeile erstellt, ist das korrekt?

Zeile 3: Ich verstehe, dass dies die Methode sortUsingDescriptors aufruft, aber meine Verwirrung ist, warum diese Funktion ein Array erwartet.

Ich habe die Dokumentation gelesen, aber ich bin wirklich auf der Suche nach einer einfachen Erklärung.

Jede Hilfe ist sehr geschätzt

+0

+1 für Ihre Bemühungen .. :-)) –

Antwort

2
  • Zeile 1: .. ja die rechte Seite. Sie erstellen ein benutzerdefiniertes Objekt mit dem Namen NSSortDescriptor. Dieses Objekt definiert ein Attribut, nach dem sortiert werden soll. Sie haben "Titel" eingegeben. So werden die Objekte in Ihrem Array-to-sort nach dieser Eigenschaft (yourObject.title "kind-of") sortiert.

  • Zeile 2: Da die Sortiermethode (sortUsingDescriptors) immer ein Array benötigt, müssen Sie ein NSArray mit nur einem Objekt erstellen. Okay, ... sieht irgendwie dumm aus. Aber macht absolut Sinn. Nehmen wir an, Sie möchten nach zwei Kriterien sortieren (sagen wir "Titel", dann "Stadt").

  • Zeile 3: Ja, es muss ein Array sein, weil nach mehr als einem Kriterium sortiert wird.

Und halten Sie immer die Erinnerung sauber: auf Leitung 1 Sie haben zuzuteilen/init einen NSSortDescriptor. So bereinigen Sie nach der Verwendung (wenn Sie nicht ARC verwenden). hinzufügen So eine Linie:

[newSortDescriptor release]; 
+0

Wir ARC habe jetzt seit etwa einem Jahr - Vielleicht ist es an der Zeit anzufangen anzunehmen, dass die Leute es benutzen, anstatt anzunehmen, dass sie es nicht sind. – Caleb

+0

Vielen Dank, wirklich nützliche Antwort und macht Sinn. –

+0

@Caleb: Ja, dein Recht. Die iOS 3.0-Unterstützung verlangsamt sich. :) –

1

Mehrere Sortier Deskriptoren verwendet werden würde, zu lösen, was, wenn es passiert, mehrere Übereinstimmungen gibt. Ich habe Vorrang. Ein zweiter Deskriptor würde ihm sagen, was zu tun wäre, wenn zwei Titel gleich wären.

5

Zeile 1: Ich verstehe hier Ich habe ein neues Objekt erstellt, das einen Deskriptor hat. Dies hat zwei Parameter, die Spalte, die ich sortieren möchte und , dass es aufsteigend ist.

Wirklich, haben Sie ein Objekt erstellt, dass ist ein Schlagwort. Es beschreibt, wie das Array sortiert wird.

Zeile 2: Das ist die Zeile, über die ich verwirrt bin. Warum benötige ich ein Array von Sortierdeskriptoren?Wenn ich diesen Code lese, vermute ich, dass es ein Array erstellt mit nur einer Zeile ist das richtig?

Rechts - Sie haben ein Array erstellt, das ein einzelnes Objekt enthält. Sie könnte erstellen ein Array, das zehn oder fünfzehn oder siebenundachtzig Sortierdeskriptoren hat, wenn Sie wirklich auf diese vielen Felder sortieren wollten. Häufiger verwenden Sie eins, zwei, vielleicht drei. Wenn Sie also eine Liste von Personen sortieren, können Sie Sortierdeskriptoren hinzufügen, die den Nachnamen und den Vornamen angeben. Auf diese Weise werden Personen mit demselben Nachnamen in dieser Gruppe nach ihrem Vornamen geordnet.

Zeile 3: Ich verstehe, dass dies die sortUsingDescriptors Methode ruft aber wieder, meine Verwirrung ist, warum diese Funktion ein Array erwartet.

Auch hier können Sie primäre, sekundäre, tertiäre (usw.) Sortierschlüssel haben. Sie können eine separate Methode verwenden, die für die Zeiten, in denen nur ein Schlüssel sortiert werden soll, anstelle eines Arrays einen einzelnen Sortierdeskriptor verwendet. NSArray liefert nicht das, aber man kann es in einer Kategorie immer, wenn Sie wollen:

@category NSArray (SingleSortDescriptor) 

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor; 

@end 

@implementation NSArray (SingleSortDescriptor) 

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor 
{ 
    return [self sortUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 
} 

@end 
+1

Tolle Erklärung! – user523234

+1

Ich bin wirklich ein großer Fan von deinen schön erklärten Antworten .. –

+1

@anonymous Ein tolles Kompliment - vielen Dank. – Caleb

Verwandte Themen