Wie deklariere ich ein Array von schwachen Referenzen in Swift?
Ich möchte das speichern einer Reihe von schwachen Referenzen in Swift. Das array selbst sollte nicht eine schwache Referenz - Elemente sein sollte. Ich denke, Kakao NSPointerArray
bietet eine non-typesafe-version dieses.
InformationsquelleAutor der Frage Bill | 2014-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie eine generische wrapper:
Hinzufügen von Instanzen dieser Klasse das array.
Beim definieren
Weak
können Sie entwederstruct
oderclass
.Auch, zu helfen, mit ernten array-Inhalt, Sie könnten etwas entlang der Linien von:
Den Einsatz von
AnyObject
oben sollte ersetzt werden, mitT
- aber ich glaube nicht, dass die aktuelle Swift-Sprache ermöglicht eine Erweiterung definiert, die als solche.InformationsquelleAutor der Antwort GoZoner
Können Sie die NSHashTable mit weakObjectsHashTable.
NSHashTable.weakObjectsHashTable()
Für Swift 3:
NSHashTable.weakObjects()
NSHashTable Klasse Referenz
InformationsquelleAutor der Antwort Thierry
Das ist nicht meine Lösung. Ich fand es auf der Apple-Developer-Foren.
@GoZoner hat eine gute Antwort, aber es stürzt der Swift-compiler.
Hier eine version von einem schwachen Objekt-container nicht Abstürzen, der Strom freigegeben compiler.
Können Sie dann erstellen Sie ein array von diesen Containern:
InformationsquelleAutor der Antwort rjkaplan
Ist es irgendwie zu spät zur party, aber versuchen Sie mir. Ich habe implementiert als ein Satz und nicht ein Array.
WeakObjectSet
Nutzung
Beachten Sie, dass WeakObjectSet nicht nehmen, String Typ, aber NSString. Weil, Typ String ist nicht ein AnyType. Mein swift version ist
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
.Code können ergriffen werden, von Gist.
https://gist.github.com/codelynx/30d3c42a833321f17d39
** HINZUGEFÜGT IM NOV.2017
Ich aktualisierte den code Swift 4
Als gokeji erwähnt, habe ich herausgefunden, NSString kommen die nicht freigegeben ist, basierend auf der code in Verwendung.
Ich kratzte mich am Kopf und ich schrieb MyString-Klasse wie folgt.
Dann ersetzen
NSString
mitMyString
wie diese. Dann seltsam zu sagen, dass es funktioniert.Dann fand ich eine seltsame Seite möglicherweise mit diesem Problem.
https://bugs.swift.org/browse/SR-5511
Er sagt das Problem ist
RESOLVED
aber ich Frage mich, ob dies noch im Zusammenhang mit diesem Problem.Trotzdem, die Unterschiede im Verhalten zwischen MyString oder NSString sind darüber hinaus in diesem Zusammenhang, aber ich wäre dankbar, wenn jemand dachte, dieses Problem aus.
InformationsquelleAutor der Antwort Kaz Yoshikawa
Können Sie dies tun, indem Sie ein wrapper-Objekt zu halten, eine schwache Zeiger.
Und dann diese in das array
InformationsquelleAutor der Antwort Joshua Weinberg
Hatte ich die gleiche Idee zu schaffen schwach container mit Generika.
Als Ergebnis habe ich erstellt wrapper für
NSHashTable
:Verwendung:
Es ist nicht die beste Lösung, weil
WeakSet
kann initialisiert werden, mit welcher Art, und wenn dieser Typ nicht entsprechenAnyObject
Protokoll dann app crash mit Ausführlicher Begründung. Aber ich sehe keine bessere Lösung jetzt.Ursprüngliche Lösung war die Definition
WeakSet
auf diese Weise:Aber in diesem Fall
WeakSet
kann nicht initialisiert werden, mit Protokoll:Derzeit obige code kann nicht kompiliert werden (Swift 2.1, Xcode 7.1).
Das ist, warum ich gelöscht gemäß
AnyObject
und zusätzliche Wachen mitfatalError()
Behauptungen.InformationsquelleAutor der Antwort Vlad Papko
Wie über funktionelle Stil-wrapper?
Rufen Sie einfach zurückgegeben Schließung zu überprüfen das Ziel ist immer noch lebendig.
Und speichern Sie diese Verschlüsse in ein array.
Und Sie abrufen können, die schwach aufgenommenen Werte durch die Zuordnung von aufrufen der Verschlüsse.
InformationsquelleAutor der Antwort Eonil
Dem vorhandenen Beispiel der WeakContainer ist hilfreich, aber es hat nicht wirklich helfen, eine Verwendung schwacher Referenzen in bestehenden swift-Container wie Listen und Dictionaries.
Wenn Sie verwenden möchten Liste Methoden wie contains, dann die WeakContainer durchsetzen müssen Gleichsetzbar ist. Also habe ich den code Hinzugefügt, um zu ermöglichen, die WeakContainer werden gleichsetzbar.
In den Fall, Sie wollte die WeakContainer in Wörterbüchern habe ich es auch gemacht hashable so kann es verwendet werden als dictionary-Schlüssel.
Ich auch umbenannt, es zu WeakObject zu betonen, dass dies nur für Klasse Typen und es zu unterscheiden von der WeakContainer Beispiele:
Diese die Ihnen erlaubt, einige Coole Sachen wie ein Wörterbuch von schwachen Referenzen:
InformationsquelleAutor der Antwort Tod Cunningham
Hier ist, wie zu machen @GoZoner tolle Antwort entsprechen
Hashable
so kann es indiziert sein, die in Container-Objekte wie:Set
Dictionary
Array
usw.InformationsquelleAutor der Antwort Sakiboy
Details
xCode 9.1, Swift 4
Lösung
Nutzung
Vollständige Probe
Ergebnis
InformationsquelleAutor der Antwort Vasily Bodnarchuk
Anderen Antworten haben die Generika-Winkel. Dachte, ich würde teilen einige einfache code-Abdeckung der
nil
Winkel.Wollte ich ein statisches array Lesen (gelegentlich) alle
Label
s, die es derzeit in der app, aber nicht wollen, um zu sehennil
's, wo die alten verwendet werden.Nichts Lust, das ist mein code...
InformationsquelleAutor der Antwort wils
Noch eine andere Lösung für das gleiche problem... der Fokus ist auf die Speicherung einer schwachen Referenz auf ein Objekt, aber so dass Sie zum speichern eines struct zu.
[Ich bin mir nicht sicher, wie nützlich es ist, aber es hat eine Weile gedauert, um die syntax right]
InformationsquelleAutor der Antwort Dan Rosenstark
Können Sie wrapper
Array
. Oder verwenden Sie diese Bibliothek https://github.com/NickRybalko/WeakPointerArraylet array = WeakPointerArray<AnyObject>()
Typ ist es sicher.
InformationsquelleAutor der Antwort Nick Rybalko