web-dev-qa-db-fra.com

importation Swift framework dans un projet objective-c

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

17
Michael A

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.

https://developer.Apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

24
fat

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;
29
saltwat5r

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.

4
Cihan Tek

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

Consommateur Objective-C -> Swift framework dynamique

Xcode version 10.2.1

Créer un Swift

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:

  1. Info.plist - Build Settings -> Info.plist File
  2. <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éfinitions
  • Headers dossier avec:
    • fichiers de la section Headers. Il existe des interfaces/définitions publiques
    • <product_name>-Swift.h - Fichier d'en-tête généré par Xcode [Sur]

Utilisation de Swift framework

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 à:

  1. Project editor -> select a target -> General -> Linked Frameworks and Libraries
  2. Project editor -> select a target -> Build Phases -> Embed Frameworks
  3. 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;

Plus d'exemples ici

0
yoAlex5