Ich habe ein Swift-Protokoll deklariert:
protocol Option {
var name: String { get }
}
Ich erkläre mehrere Implementierungen dieses Protokolls - einige Klassen, einige Aufzählungen.
Ich habe einen Ansichts-Controller mit einer Eigenschaft, die wie folgt deklariert ist:
var options: [Option] = []
Wenn ich versuche, diese Eigenschaft auf ein Array von Objekten festzulegen, die das Option
Protokoll in anderen VCs implementieren prepareForSegue
, wird ein Laufzeitfehler angezeigt:
fatal error: array cannot be bridged from Objective-C
Warum funktioniert das nicht? Der Compiler verfügt über alle erforderlichen Informationen, und ich verstehe überhaupt nicht, was Objective-C damit zu tun hat. Mein Projekt enthält nur Swift-Dateien, und diese Arrays kommen nicht in Framework-Methoden hinein oder aus diesen heraus erfordern, dass sie überbrückt werden NSArray
.
ios
swift
swift-protocols
Robert Atkins
quelle
quelle
@objc
, Ihrem Protokoll voranzukommen ? stackoverflow.com/a/28029568/377369Antworten:
Ich habe eine Lösung gefunden. Es ist ziemlich ... unbefriedigend , aber es funktioniert. Wo ich das Array auf dem Zielansichts-Controller einstelle, mache ich:
quelle
options as [Option]
Sie haben dort eine sehr aufschlussreiche Bemerkung hinterlassen, die die Ursache des Problems nahe legt. Ein "Array von Dingen, die Option implementieren" ist kein Array von Optionen.
Das Problem liegt in der Art des
options
Rückens an dem Punkt, an dem Sie ihn erstellen (inprepareForSegue
). Sie zeigen diesen Code nicht an, aber ich wette, dass Sie ihn zu diesem Zeitpunkt nicht umsetzen / eingeben können. Deshalb schlägt die Zuordnung fehl.options
Möglicherweise gibt es eine Reihe von Dingen, die tatsächlich dazu führen, dass Option übernommen wird, aber das reicht nicht aus. Es muss als Array von Optionen eingegeben werden .Also, zurück in
prepareForSegue
, bilden Sie Ihreoptions
wie folgt:Jetzt können Sie es direkt zuweisen
destinationViewController.options
.Hier ist ein kurzer Testfall (auf einem Spielplatz; ich verabscheue Spielplätze, aber sie können ihre Verwendung haben):
(Ich habe dies auch in einer tatsächlichen App mit einer tatsächlichen getestet
prepareForSegue
, und es funktioniert gut.)quelle
viewController.options = things as [Option]
) noch das Erstellen einer temporären Variablen, die explizit wie[Option]
hier vorgeschlagen eingegeben wurde, tatsächlich. In beiden Fällen erhalte ich den Laufzeitfehler.Ich hatte das gleiche Problem und habe es behoben, indem ich mein Protokoll mit markiert habe
@objc
. In Ihrem Fall würde es so aussehenHabe die Lösung aus dieser Antwort
quelle
Dieser funktioniert auch gut
quelle