Was ist ein Slice in Swift und wie unterscheidet es sich von einem Array?
Aus der Dokumentation geht hervor, dass die Typensignatur des Index (Bereich):
subscript(Range<Int>) -> Slice<T>
Warum nicht Array<T>
lieber einen anderen als einen zurückgeben Slice<T>
?
Es sieht so aus, als könnte ich ein Slice mit einem Array verketten:
var list = ["hello", "world"]
var slice: Array<String> = [] + list[0..list.count]
Dies ergibt jedoch den Fehler:
Es konnte keine Überladung für 'tiefgestellt' gefunden werden, die die angegebenen Argumente akzeptiert
var list = ["hello", "world"]
var slice: Array<String> = list[0..list.count]
Was ist eine Scheibe?
Hinweis: Diese Antwort ist ab Swift Beta 3 glücklicherweise ungültig, da Arrays jetzt echte Werttypen sind.
@matt ist oben korrekt - die
Slice<T>
Punkte im Array. Dies scheint der Art und Weise zu widersprechen, wie Swift mit allen anderen Datentypen umgeht, mit denen wir arbeiten, da sich der Wert des Slice ändern kann, selbst wenn es als Konstante deklariert ist:Das Schlimmste ist, dass sich das Slice wie ein Array verhält. Angesichts der Tatsache, dass wir in Swift eine Unveränderlichkeit erwarten, scheint es gefährlich, dass sich die tiefgestellten Werte des Slice ohne Vorwarnung ändern können:
Wenn sich das zugrunde liegende Array jedoch zu drastisch ändert, werden sie ausgehängt:
quelle
let arr = ["hello", "world", "goodbye"]; arr[0] = "bonjour"
. Sie werden feststellen, dass es funktioniert. Bei unveränderlichen Arrays ist seltsamerweise nur die Größe unveränderlich, nicht der Inhalt. (Siehe "Veränderbarkeit von Sammlungen" in der Programmiersprache Swift )Zusammenfassung:
Die obigen Antworten waren bis zur Beta 3 wahr (und können sich in zukünftigen Versionen erneut ändern).
Slice verhält sich jetzt wie ein Array, ist jedoch, wie oben erwähnt, effektiv eine flache Kopie eines Arrays unter der Haube, bis eine Änderung vorgenommen wird. Slices (jetzt) sehen eine Momentaufnahme der ursprünglichen Werte.
Beachten Sie auch, dass sich die Slice-Syntax geändert hat:
Beispiel:
Dies ermöglicht eine viel gleichmäßigere Verarbeitung, da die Verarbeitung von Listen im Python-Stil einfacher ist (IMHO) - Filtern einer Liste, um eine andere zu erstellen. Gemäß Matts Antwort vor Beta 3 mussten Sie ein temporäres Array erstellen, um ein Slice zuzuordnen. Der neue Code ist jetzt einfacher:
(obwohl um fair zu sein, ist foo immer noch ein Stück)
Referenz:
http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_3_lpw27r/xcode_6_beta_3_release_notes__.pdf
Wichtige Änderungen, gelöste Probleme, - Schnelle Sprache, Absatz 1
"Array in Swift wurde komplett neu gestaltet, um eine vollständige Semantik wie Dictionary und String ... m zu erhalten."
quelle