J'essaie d'importer un protocole Swift nommé AnalyticProtocol
dans une classe Objective-C nommée AnalyticFactory
.
protocol AnalyticProtocol
{
}
Je pars d'un projet Objective-C existant (je n'ai pas créé de nouveau projet Swift avec xCode et je n'ai pas trouvé comment configurer mon projet Objective-C pour être un projet Swift dans xCode 6 ).
Dans mon fichier Swift, j'ai inclus le .h
fichier nommé MyProjectName-Swift.h
mais le compilateur m'a renvoyé une erreur m'indiquant qu'il n'existe pas . Donc, j'ai créé un .h
fichier nommé MyProjectName-Swift.h
qui est en fait vide (je ne sais pas ce que je dois mettre à l'intérieur).
Dans la documentation Apple, ils ont dit que je devais inclure mon .h
fichier nommé MyProjectName-Swift.h
dans mon .m
fichier. Mais je dois l'inclure non pas dans mon .m
fichier mais dans mon fichier .h
. Cela peut-il être problématique?
Lorsque j'essaie de compiler, j'ai cette erreur:: 0: erreur: xxxAnalyticFactory.h: 39: impossible de trouver la déclaration de protocole pour 'AnalyticProtocol'
Et le code incriminé:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Je pense que je ne comprends pas bien comment importer un protocole Swift dans une classe Objective-C.
Quelqu'un voit-il une erreur dans ce que je fais?
la source
Réponses:
Vous devez ajouter l'
@objc
attribut à votre protocole Swift comme suit:la source
@interface
dans le.h
fichier. cependant, vous pouvez ajouter le protocole au privé@interface
dans le.m
fichier et il corrige les choses (du moins il l'a pour moi à l'occasion). Donc au-dessus de votre@implementation
avoir@interface MyController() <AnalyticProtocol>
.Il n'est pas possible d'importer l'en-tête Swift généré par Xcode dans les fichiers d'en-tête objC.
Donc, puisque vous souhaitez utiliser du code Swift dans un fichier d'en-tête objC, vous devrez "déclarer en avant" les classes et protocoles que vous souhaitez utiliser dans le fichier d'en-tête objC, comme ceci:
Vous pouvez maintenant utiliser le protocole dans votre déclaration de classe objC:
Dans votre fichier d'implémentation (le fichier objC .m), vous pouvez importer le fichier d'en-tête Swift généré par Xcode ("ProductModuleName-Swift.h") et l'implémentation correcte
AnalyticProtocol
sera désormais connue du compilateur.Ceci est également décrit dans la section «Utilisation de Swift à partir d'Objective-C» dans la documentation Apple
Notez que XCode donnera un avertissement dans le fichier d'en-tête objC lorsque vous utilisez le protocole déclaré avant ("Impossible de trouver la définition de protocole pour 'AnalyticProtocol'), mais cela peut être ignoré - l'implémentation sera trouvée au moment de la compilation.
la source
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Pour quiconque a simplement besoin d'adopter un protocole - vous pouvez le faire en deux étapes, sans générer d'avertissements ou d'erreurs:
Dans votre
.swift
fichier, ajoutez@objc
avant le nom du protocole:Dans votre
.m
fichier, importez l'en-tête Swift généré et adoptez le protocole dans une catégorie privée. (Le fichier d'en-tête est nommé automatiquement):C'est l'approche recommandée par Apple. Vous pouvez en savoir plus sur le mélange et la correspondance entre Objective-C et Swift ici: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
la source
#import "AnalyticProtocol-Swift.h"
. On dirait que WhateverProtocol-Swift.h n'est pas généré automatiquement comme vous l'avez dit.Si vous créez un framework, l'importation requise
change pour:
Dans ce cas, vous devez également rendre public le protocole swift :
la source
Nous pouvons utiliser des protocoles rapides en Objective C avec quelques modifications du code. De plus, les protocoles déclarés @objc vous permettent d'avoir des méthodes facultatives et obligatoires sans implémentations par défaut. Il comporte des avantages et des inconvénients.
Nous pourrions en fait renommer le nom du protocole en un nom plus descriptif lors de l'utilisation en Objective C. J'utilise "@objc (alias_name)".
Voici le code, ayons un protocole rapide avec l'attribut @objc et le nom d'alias à utiliser dans le code ObjC.
Laissons maintenant farword déclarer notre protocole dans un fichier .h
Vous pouvez maintenant vous conformer à ce protocole dans le fichier .m et ajouter l'implémentation des méthodes requises.
la source