Hierbei handelt es sich um Cocoa-Array-Objekte (Instanzen von NSArray), nicht um C-Arrays oder C ++ - Vektoren. Denken Sie daran, dass Objective-C nicht überladen wird. Die einzigen Dinge, die Sie mit einem Objekt tun können, sind das Weitergeben, das Speichern in Variablen und das Senden von Nachrichten an das Objekt.
Also ist der Array-Subscript-Operator bei Objective-C-Objekten falsch. Ich glaube nicht, dass es sogar sprachlich gültig ist, einen Zeiger auf ein Objective-C-Objekt zu dereferenzieren, daher sollte Ihnen dieser Code einen Compilerfehler geben. Ich kann mich allerdings geirrt haben. Wenn es zur Laufzeit kommt, stürzt dieser Code früher oder später ab, da Sie auf Speicher jenseits der Enden der Array-Objekte zugreifen.
(EDIT aus dem Jahr 2013: Objective-C unterstützt jetzt das Subskribieren von Objekten. Dies führt letztendlich zu der entsprechenden Nachricht objectAtIndex:
oder replaceObjectAtIndex:withObject:
. Also würde der Code in der Frage jetzt funktionieren, obwohl es immer noch nicht funktioniert der richtige Weg, einfach ein Array zu gehen, geschweige denn zwei Arrays zu vergleichen.)
Die richtige Methode zum Abrufen eines Objekts aus einem NSArray-Objekt durch seinen Index besteht nicht darin, den Array-Subscript-Operator zu verwenden, sondern zum Senden des Array-Objekts die Nachricht objectAtIndex:
:
Der richtige Weg, um die Elemente eines Array-Objekts zu durchlaufen, vorausgesetzt, dass Sie den Index für etwas anderes nicht wirklich benötigen (z. B. das Ersetzen von Objekten in einem veränderbaren Array), ist es direkt zu loopen (dies wird " schnelle Aufzählung "):
%Vor% NSArray reagiert auch auf objectEnumerator
und reverseObjectEnumerator
, die ein ähnlich iterierbares Objekt zurückgeben. Von den beiden ist reverseObjectEnumerator
im neuen Code umso nützlicher, da Sie das Array einfach direkt durchlaufen können, um vorwärts zu iterieren. Beide waren am nützlichsten, bevor eine schnelle Aufzählung existierte; dieser Code sah so aus:
(Ja, das ist eine Aufgabe in der Bedingung. Absichtlich, daher die extra ()
. Wir haben damals mutig programmiert, oder?)
Für das, was Sie tun, möchten Sie wahrscheinlich eher eines der Arrays eine isEqualToArray:
-Nachricht senden, wie Williham Totland vorgeschlagen hat:
Dies stellt sicher, dass beide Arrays die gleiche Länge haben, dann gehen Sie beide in lock-step und senden isEqual:
an jedes Objektpaar. Es wird YES
zurückgegeben, wenn jede isEqual:
Nachricht zurückgegeben wurde YES
; NO
ansonsten. Die Arrays können verschiedene Objekte enthalten, aber solange jedes Paar gleich ist, sind die Arrays selbst gleich.
Das setzt voraus, dass Sie die Objektgleichheit wünschen. Zwei separate Objekte sind gleich, wenn einer von ihnen mit YES
antwortet, wenn Sie ihm eine isEqual:
-Nachricht senden und das andere Objekt übergeben. Wenn Sie die Identitäten der Objekte vergleichen möchten, müssen Sie die Lock-Step-Schleife selbst durchführen und ==
verwenden:
Aber das ist unwahrscheinlich. Meistens wollte ich die Gleichheit der Objekte testen, nicht die Identitäten, also isEqualToArray:
ist was ich wollte.
Sie möchten die Methode isEqualToArray:
. Wie in:
Dies wird rekursiv die beiden Arrays vergleichen, während es den Vorteil hat, dass es nicht unnötig umständlich ist und keine Schleife benötigt.
Sagen Sie uns das Ergebnis, das Sie erhalten, wenn Sie diesen Code ausführen. Der Ansatz ist korrekt, aber versuchen Sie es:
%Vor%Hier ist eine kleine, die ich basierend auf dem Top-Ranking zusammengestellt habe. Dies überprüft lediglich, dass die Arrays die gleichen Werte enthalten, unabhängig von der Reihenfolge und ob es Dubletten gibt. Ich verwende das hauptsächlich, um Schlüssel von zwei Wörterbüchern zu vergleichen (die oft ihre allKeys-Arrays in verschiedenen Sortierreihenfolgen zurückgeben), um zu sehen, ob sie die gleichen Objekte enthalten. Danke Peter Hosley für die Bereitstellung des Beispiels, aus dem ich das übernommen habe.
%Vor%Ich mache Folgendes beim Vergleich von Arrays:
Um Elemente zu vergleichen, müssen Sie definieren, was Sie als "gleich" ansehen möchten. Sind sie nur dann gleich, wenn die Zeiger im Array gleich sind oder sie gleich sein können, wenn auch der Inhalt gleich ist.
Für den Zeigerfall können Sie ==.
verwendenFür den tiefen Vergleich müssen Sie CompareTo oder etwas ähnliches verwenden.
Tags und Links arrays objective-c cocoa compare