Vergleichen Sie Arrays in Swift
Versuchen zu verstehen, wie swift vergleicht arrays.
var myArray1 : [String] = ["1","2","3","4","5"]
var myArray2 : [String] = ["1","2","3","4","5"]
//1) Comparing 2 simple arrays
if(myArray1 == myArray2) {
println("Equality")
} else {
println("Equality no")
}
//-> prints equality -> thanks god
//2) comparing to a "copy" of an array
//swift copies arrays when passed as parameters (as per doc)
func arrayTest(anArray: [String]) -> Bool {
return anArray == myArray1
}
println("Array test 1 is \(arrayTest(myArray1))")
println("Array test 2 is \(arrayTest(myArray2))")
//equality works for both
myArray2.append("test")
println("Array test 2 is \(arrayTest(myArray2))")
//false (obviously)
myArray2.removeAtIndex(5)
println("Array test 2 is \(arrayTest(myArray2))")
// true
Apple sagt, es gibt Optimierungen, die hinter der Szene auf array kopiert. Sieht aus wie manchmal - nicht immer - Strukturen sind tatsächlich kopiert wurden oder nicht.
Sagte,
1) = = Iteration über alle array-durchführen einer element-Basis-Vergleich ? (wie es aussieht)
-> Wie etwa performance /Speicherverbrauch bei sehr großen arrays dann ?
2.) Sind wir sicher nicht == wird immer true zurückgeben, wenn alle Elemente gleich sind ? Ich habe schlechte Erinnerungen an == Java-Zeichenfolgen
3) gibt es eine Möglichkeit zu überprüfen, ob myArray1 und myArray2 sind technisch mit den selben "Speicher" /Zeiger /etc. ? ich bin nach dem Verständnis, wie die Optimierung funktioniert und potenzielle Vorbehalte.
Dank.
===
===
wird nur für Klassen, Array
ist ein struct. func ==<T : Gleichsetzbar>(LS: [T], rhs: [T]) -> Bool
mit dem Kommentar /// Gibt true zurück, wenn diese arrays enthalten die gleichen Elemente.
InformationsquelleAutor der Frage vivien.destpern | 2014-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sind zu Recht etwas nervös
==
:Warum? Swift-arrays entsprechen nicht
Equatable
, aber Sie haben eine==
- operator, definiert die standard-Bibliothek:Dieser operator Schleifen über die Elemente, die in
lhs
undrhs
den Vergleich der Werte an jeder position. Es tut nicht mache eine bitweise vergleichen – es ruft die==
- operator auf jedes paar von Elementen. Das heißt, wenn Sie schreiben eine benutzerdefinierte==
für Ihr element, es werde aufgerufen.Aber es enthält eine Optimierung – wenn der zugrunde liegende Puffer für die zwei arrays sind gleich, es stört, es ist einfach true zurückgibt (Sie enthalten identische Elemente natürlich sind Sie gleich!).
Dieser Frage ist ausschließlich die Schuld der
NeverEqual
Gleichheitsoperator. Gleichheit sollte sein, die transitiv, symmetrisch und reflexiv ist, und dieses ist nicht reflexiv (x == x
ist false). Aber es könnte dich überraschen.Swift-arrays sind copy-on-write – so, wenn Sie schreiben
var x = y
es eigentlich nicht machen, eine Kopie des Arrays, es nur Punktex
's Speicher-Puffer-Zeiger any
's. Nur wennx
odery
sind mutierte später hat es dann eine Kopie des Puffers, so dass die variable unverändert bleibt davon unberührt. Dies ist entscheidend für die arrays Verhalten sich wie Werttypen, aber immer noch performant.In frühen Versionen von Swift, die Sie eigentlich nennen könnte
===
auf arrays (auch in frühen Versionen, die mutiert Verhalten war ein bisschen anders, wenn Sie mutiertx
,y
würde auch ändern, obwohl es erklärt wurde, mitlet
– die Angst der Menschen heraus, damit Sie ihn geändert).Kannst du irgendwie reproduzieren das alte Verhalten
===
auf arrays mit diesem (sehr von der Implementierung abhängige nicht verlassen-außer für stochern und stupsen Untersuchungen) trick:InformationsquelleAutor der Antwort Airspeed Velocity
==
in Swift ist das gleiche wie Javaequals()
es vergleicht Werte.===
in Swift ist das gleiche wie Java==
es vergleicht Referenzen.In Swift können Sie vergleichen, array-Inhalt Werte so einfach wie diese:
Aber das wird nicht funktionieren, wenn Sie vergleichen möchten Referenzen:
Also die Antworten:
Vergleiche
Standort ist der gleiche, nur wenn man es im Vergleich zu sich selbst (oder verwenden Sie unsicher
Zeiger)
InformationsquelleAutor der Antwort Kirsteins
Es hängt davon ab, wie Sie wollen, zu vergleichen. Zum Beispiel:
["1", "2"] == ["1", "2"] //true
aber
["1", "2"] == ["2", "1"] //false
Wenn Sie brauchen, dass der zweite Fall auch wahr sein und sind ok mit ignorieren wiederholende Werte, die Sie tun können:
Set(["1", "2"]) == Set(["2", "1"]) //true
(verwenden Sie NSSet für Swift 2)
InformationsquelleAutor der Antwort demosten
Arrays entsprechen
Equatable
im Swift-4.1, negiert die Vorbehalte erwähnt in den vorherigen Antworten. Dies ist in Xcode 9.3.https://swift.org/blog/conditional-conformance/
InformationsquelleAutor der Antwort Greg McCoy