J'importe Swift framework dans le projet objective-c comme ceci:
@import MyFramework;
Le problème est que seules certaines des classes sont reconnues par la classe dans laquelle j'importe le framework.
La classe reconnue:
public class RecognizedClass:UIViewController, WKNavigationDelegate, WKScriptMessageHandle
{ ... }
La classe qui n'est pas:
public class VeediUtils
{ ... }
Ils sont tous les deux publics, alors pourquoi le premier est reconnu dans l'espace de travail et l'autre non?
Je vois aussi dans le fichier d'en-tête MyFramework-Swift.h qu'une classe
@interface RecognizedClass : UIViewController <WKNavigationDelegate, WKScriptMessageHandler>
Apparaissent alors que les autres ne le font pas
Pourquoi donc?
De plus, pour signaler que cette même procédure fonctionne lorsque j'importe Swift framework to Swift project
Pour accéder à une classe Swift dans objc, qui n'est pas héritée de NSObject, vous devez:
@objc public class VeediUtils
Une classe ou un protocole Swift doit être marqué avec l'attribut @objc pour être accessible et utilisable dans Objective-C. Cet attribut indique au compilateur que cette partie de Swift = le code est accessible depuis Objective-C. Si votre classe Swift est un descendant d'une classe Objective-C, le compilateur ajoute automatiquement l'attribut @objc pour vous.
Si vous avez précédemment configuré Project pour l'intégration avec Swift et que vous souhaitez utiliser Swift Dynamic Framework, vous devez l'importer de cette façon (remplacez {value} par le noms selon votre projet):
#import <{MyFramework}/{MyFrameworkMainClass}-Swift.h>
#import "{YourProjectTargetName}-Swift.h"
ÉDITER:
Si votre framework a Defines Module
défini sur true
, vous pouvez l'importer comme ceci:
@import MyFramework;
Vous devez ajouter @objc
à la déclaration de la classe VeediUtils
, ou la faire hériter de NSObject
. Sinon, il ne sera pas visible par Objective-C.
Dans votre cas, RecognizedClass
est reconnu car il s'agit d'une sous-classe de UIViewController
, qui est une sous-classe de NSObject
.
Utilisation de Swift Classes dans Objective-C
Si vous prévoyez d'importer du code dans une cible d'application (mélange d'Objective-C et Swift dans un projet), vous devez utiliser la ligne d'importation suivante #import "<#YourProjectName#>-Swift.h"
pour exposer Swift code au code Objective-C [Mixage Swift et code Objective-C dans un projet]
Dans cet article, je vais décrire comment importer Swift framework vers le code Objective-C
Xcode version 10.2.1
Créer un projet cadre ou créer une cible cadre
File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework
Deux fichiers seront générés:
Info.plist
- Build Settings -> Info.plist File
<product_name>.h
- Build Phases -> Headers
. C'est un fichier d'en-tête parapluie [Sur]Ajouter des fichiers .Swift
Select `.Swift` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files
Expose Swift API. Pour utiliser les fonctions de Swift depuis Objective-C [Sur]
Créer une bibliothèque - ⌘ Command + B ou Product -> Build
Remarque: assurez-vous de créer le framework pour la même architecture de processus que le code client.
Rechercher la sortie générée [Lieu de construction]
Products group -> <product_name>.framework -> Show in Finder
Le cadre comprend
Info.plist
Modules
dossier avec: module.modulemap
[Sur][Modulemap personnalisé] Ce fichier a été généré automatiquement car Build Settings -> Defines Module -> YES
<product_name>.swiftmodule
dossier avec .swiftdoc
- documents.swiftmodule
- interface publique/définitionsHeaders
dossier avec: Headers
. Il existe des interfaces/définitions publiques<product_name>-Swift.h
- Fichier d'en-tête généré par Xcode [Sur]Drag and drop
le binaire dans le projet Xcode [Sur]
Embed binaries
[Bibliothèque non chargée][Lien vs intégration]
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file
J'ajouterai automatiquement le framework à:
Project editor -> select a target -> General -> Linked Frameworks and Libraries
Project editor -> select a target -> Build Phases -> Embed Frameworks
Project editor -> select a target -> Build Phases -> Link Binary With Libraries
Ajouter Framework Search paths
[Module introuvable][Chemin récursif]
Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file
Importer le module dans le code client Objective-C [nom_module]
@import module_name;