J'ai déclaré un protocole Swift:
protocol Option {
var name: String { get }
}
Je déclare plusieurs implémentations de ce protocole - certaines classes, certaines énumérations.
J'ai un contrôleur de vue avec une propriété déclarée comme suit:
var options: [Option] = []
Lorsque j'essaie de définir cette propriété sur un tableau d'objets qui implémentent le Option
protocole dans un autre VC prepareForSegue
, j'obtiens une erreur d'exécution:
fatal error: array cannot be bridged from Objective-C
Pourquoi ça ne marche pas? Le compilateur a toutes les informations dont il a besoin, et je ne comprends pas du tout ce que Objective-C a à voir avec lui - mon projet ne contient que des fichiers Swift, et ces tableaux ne viennent ni ne sortent d'aucune méthode de framework qui nécessiter leur pontage NSArray
.
ios
swift
swift-protocols
Robert Atkins
la source
la source
@objc
votre protocole? stackoverflow.com/a/28029568/377369Réponses:
J'ai trouvé une solution. C'est assez ... insatisfaisant , mais ça marche. Où je place le tableau sur le contrôleur de vue de destination, je fais:
la source
options as [Option]
Vous avez laissé échapper une remarque très révélatrice, qui suggère la source du problème. Un «tableau de choses qui implémentent l'option» n'est pas un tableau d'options.
Le problème vient du type de
options
dos au point où vous le créez (enprepareForSegue
). Vous ne montrez pas ce code, mais je parie que vous ne parvenez pas à le lancer / le taper à ce stade. C'est pourquoi la mission échoue.options
peut être un éventail de choses qui adoptent effectivement Option, mais ce n'est pas suffisant; il doit être saisi comme un tableau d'Option.Alors, de retour
prepareForSegue
, formez votreoptions
comme ceci:Maintenant , vous serez en mesure d'attribuer directement à
destinationViewController.options
.Voici un cas de test rapide (dans une aire de jeux; je déteste les aires de jeux, mais elles peuvent avoir leurs utilisations):
(J'ai également testé cela dans une application réelle avec un réel
prepareForSegue
, et cela fonctionne bien.)la source
viewController.options = things as [Option]
) ni création d'une variable temporaire explicitement tapée[Option]
comme vous le suggérez ici ne fonctionnent réellement. Dans les deux cas, j'obtiens l'erreur d'exécution.J'avais le même problème et je l'ai corrigé en marquant mon protocole avec
@objc
, dans votre cas, cela ressemblerait à ceciVous avez la solution de cette réponse
la source
Celui-ci fonctionne également très bien
la source