Warum kann das Schlüsselwort "weak" nur auf Klassen- und Klassengebundene Protokolltypen angewendet werden?
Wenn ich das deklarieren von Variablen als weak
Swift, bekomme ich manchmal die Fehlermeldung von Xcode:
'schwach' kann nur angewendet werden, um die Klasse und die Klasse gebunden Protokoll-Typen
Ich Frage mich nur, warum keyword - weak
kann nur angewendet auf die Klasse und die Klasse gebunden Protokoll-Typen? Was ist der Grund dahinter?
InformationsquelleAutor der Frage Thor | 2016-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
weak
ist ein qualifier für die Referenz-Typen (im Gegensatz zu Wert-Typen wiestruct
s und eingebauten Werttypen).Referenz-Typen können Sie mehrere Referenzen auf das gleiche Objekt. Das Objekt wird freigegeben, wenn der Letzte starke Referenz anhält, verweisen auf (schwache Referenzen zählen nicht).
Wert-Typen, auf der anderen Seite, zugeordnet sind, durch kopieren. Referenz-Zählung nicht gelten, so
weak
modifier macht keinen Sinn mit Ihnen.InformationsquelleAutor der Antwort dasblinkenlight
Ein häufiger Grund für diesen Fehler ist, dass Sie erklärt haben, Sie eigenen Protokoll, aber vergessen zu Erben aus NSObjectProtocol:
Den code oben wird Ihnen den Fehler, wenn Sie vergessen, Erben von
NSObjectProtocol
. Der Grund dafür ist, dassweak
macht nur Sinn für Referenz-Typen (Klassen). So machen Sie dem compiler weniger nervös durch die eindeutige Erklärung, dass die PenguinDelegate soll für die Klassen, und nicht Wert-Typen.InformationsquelleAutor der Antwort Jak
Wenn Sie Typ-Klasse nach Ihrem Protokoll, das es so gut funktioniert und scheint besser geeignet, die für NSObjectProtocol.
InformationsquelleAutor der Antwort Aaronium112
Gut, nur für den Fall jemand denkt, dass du alles richtig in deinem code wie ich, schauen Sie, dass Sie nicht versehentlich ersetzt die
:
durch eine=
.Hier ist, was ich hatte. Es war auch mir der gleiche Fehler wie oben:
Aber der richtige Weg ist:
Sehen Sie den Unterschied? Es dauerte eine Weile, um zu sehen, dass ich hatte ein Gleichheitszeichen statt Doppelpunkt. Beachten Sie auch, dass ich andere Fehler der gleichen Linie, denn ich hatte mich entschieden, mein Erster Fehler scheinen, wie die meisten wahrscheinlich das eigentliche problem :
:-<
InformationsquelleAutor der Antwort Patrick Miron
Ich war mit objective-C-Klasse in swift für einen scrolView. Ich IBOutlet erstellt, scroll-Ansicht. Und beim kompilieren von code mit diesem Fehler begann, zeigen.
So zu lösen diese Art von Problem, importieren Sie die Klasse in Ihrer bridging-header
War ich mit Xcode 9.2 mit swift 3.2
InformationsquelleAutor der Antwort Pramod More
Finde ich heraus, in einem Fall, in dem Sie haben sogar Klasse Typ, aber immer noch erhalten Sie diese Fehlermeldung.
Beispielsweise
Hier ein
UITextView
- Objekt zurückgegeben, von einen anonymen block als Initialisierung dervar myText
. Ich habe die gleiche Art von Fehlermeldung. Um das Problem zu beheben, dievar
markiert werden alslazy
:InformationsquelleAutor der Antwort David.Chu.ca
weak
ist für ARC(Automatic Reference Counting). Es bedeutet nicht, Verweis für die Zählung hinzufügen. Also es funktioniert nur fürClass
. Und in Swift, erhalten Sie optional den Wert für security.InformationsquelleAutor der Antwort Lumialxk
Ich habe versucht, die String-und Array-typisierte Eigenschaften für eine Schließung. Ich bekam diesen Fehler:
Spielte ich eine Weile auf dem Spielplatz, und es stellte sich heraus, das erfassen selbst ist genug für diese Typen.
InformationsquelleAutor der Antwort iOSdev