J'ai cherché quelques articles, je pense que je ne peux pas écrire une extension sous swift, et l'appeler à partir du code Objective-C, non?
@objc comme les attributs ne supportent que les méthodes, la classe, les protocoles?
objective-c
swift
swift-extensions
sprhawk
la source
la source
Réponses:
Vous pouvez écrire une extension Swift et l'utiliser dans du code Objective-C. Testé avec XCode 6.1.1.
Tout ce que vous avez à faire est:
créez votre extension dans Swift (sans
@objc
annotation)#import "ProjectTarget-Swift.h"
dans votre classe Objective-C (où "ProjectTarget" représente la cible XCode à laquelle l'extension Swift est associée)appeler les méthodes depuis l'extension Swift
Mise à jour: à partir de @Rizwan Ahmed mentionné, vous devez ajouter une
@objc
annotation:la source
J'ai découvert que dans Swift 4.0, je devais ajouter
@objc
devant mon mot-clé d' extension pour que les méthodes d'extension Swift deviennent visibles par une instance de la classe Objc que j'étendais.En bref:
Configuration de la configuration des fichiers:
Dans CustomClassExtension:
Dans mon AppDelegate.m:
la source
@nonobjc
annotation.Cette solution fonctionne pour Swift 2.2 et Swift 3 . Notez que seules les extensions pour les classes (pas pour les structs ou les enums) seront accessibles depuis Objective-C.
Puis # import "ProductModuleName-Swift.h" dans votre fichier ObjC.
Swift 4
la source
public
c'est nécessaire? Fonctionne très bien sanspublic
modificateur pour moi. Supposons-nous que l'extension ne fait pas partie du même projet mais qu'elle est importée d'un autre projet?Comme indiqué dans les autres réponses, l'importation de l'en-tête Swift généré fonctionne dans la plupart des cas .
Une exception à cela est lorsque la catégorie est définie sur un type ponté (c'est-à-dire que l'extension est définie sur
String
et nonNSString
). Ces catégories ne seront pas automatiquement reliées à leurs homologues Objective-C. Pour contourner ce problème, vous devrez soit utiliser le type Objective-C (et convertir la valeur de retour dans votre code Swift avecas String
), soit définir une extension pour les types Swift et Objective-C.la source
public extension NSString
. Si vous obtenez un identifiant non résolu ou une erreur similaire au moment de la compilation, vous pouvez reconstituer à nouveau String par exemplelet sVal = self as String
, puis appeler le code nécessaire sursVal
mclaughlinj
dit, pour la classe NSString et la structure StringImportez l'en - tête "#import" ProductModuleName-Swift.h " dans le fichier objective-c et ajoutez @objc en face de votre extension dans le fichier swift. Cela fonctionnera bien dans swift 4.2 et swift 5
la source