J'essaie d'utiliser un cadre Objective C avec le langage de programmation Swift pour le développement iOS 8. Il s'agit d'un cas spécifique d'importation, mais le problème général est le suivant:
Comment importer un framework Objective C dans Swift et obtenir la reconnaissance de l'importation?
J'essaie d'intégrer le framework Parse dans une application Swift utilisant les versions bêta d'iOS 8 et Xcode 6.
Voici la technique d'intégration du framework Parse dans Objective C:
https://www.parse.com/apps/quickstart#social/mobile/ios/native/existing
J'ai téléchargé le framework Parse sous forme d'archive compressée, je l'ai extrait et importé dans Xcode 6 sans aucun problème. Dans mon application, il apparaît sous forme de framework correctement formaté sous le nom Parse.framework.
Mon processus de pensée actuel consiste à modifier le AppDelegate.Swift
fichier dans le répertoire racine de mon projet. Voici le fichier actuel sans modifications (généré automatiquement par Xcode lors de Swift)):
https://Gist.github.com/fconcklin/e8ef7d8b056105a04161
J'ai essayé d'importer parse en ajoutant la ligne import Parse
sous la ligne import UIKit
. Cependant, Xcode avertit qu'aucun module de ce type n'a été trouvé et que la construction échoue.
J'ai aussi essayé de créer un fichier ${PROJ_NAME_HERE}-Bridging-Header.h
qui contient l’importation Parse de l’objectif C en utilisant import <Parse/Parse.h>
. Cette ligne ne génère pas d'erreur mais semble finalement ne faire aucune différence.
Merci d'avance. Faites-moi savoir si vous avez besoin de plus d'informations.
Une méthode "anti-imbécile" pour ajouter un en-tête de pontage est la suivante:
Si vous avez un projet Swift, ajoutez un nouveau fichier Objective-C à votre projet et Xcode vous le demandera si vous souhaitez configurer votre projet avec un en-tête de pontage. Appuyez sur oui.
Si vous avez un projet Objective-C, ajoutez-y un nouveau fichier Swift et vous obtiendrez le même message. Appuyez sur oui.
Après avoir obtenu l'en-tête de pontage, vous pouvez supprimer le fichier que vous venez d'ajouter si vous le souhaitez.
Après d’autres recherches, j’ai trouvé la solution et réalisé que j’étais confus.
La bonne approche est la suivante:
Importez votre infrastructure Objective C en la faisant glisser dans un projet Xcode 6 Swift.
Créez un nouveau fichier Objective C dans votre projet (Fichier-> Nouveau-> Fichier [Objective C pour iOS]).
Acceptez l'invite (d'accord) pour créer un fichier d'en-tête de pontage entre Objective C et Swift.
Supprimez le fichier Objective C que vous venez de créer mais conservez le fichier d’en-tête de pontage ${YOURPROJ}-Bridging-Header.h
.
Dans le fichier d’entête Bridging, importez votre infrastructure à l’aide de la syntaxe standard Objective C import (par exemple, #import <Parse/Parse.h>
).
Cela évite d'avoir à effectuer un import Parse
déclaration dans votre AppDelegate.Swift
fichier. Vous pouvez maintenant écrire du code utilisant n'importe quel framework, à condition qu'il soit importé à l'aide de l'en-tête de pontage. Il est disponible dans tous les fichiers Swift de votre projet).
Maintenant, si vous souhaitez tester l’intégration de Parse dans votre projet, vous pouvez taper Parse.
et utilisez la complétion de code pour parcourir le cadre et voir que la complétion de code indique une importation réussie.
Cependant, une autre mise en garde ici doit être prise en compte lors de l'utilisation d'un fichier d'en-tête de pontage. Toutes les dépendances de la structure doivent également être spécifiées dans le fichier d’en-tête de pontage. Dans le cas de l'intégration du cadre Parse dans une application Swift, votre fichier d'en-tête de pontage ressemblera à ceci:
#import <Foundation/Foundation.h>
// Parse Dependencies
#import <AudioToolbox/AudioToolbox.h>
#import <CFNetwork/CFNetwork.h>
#import <CoreGraphics/CoreGraphics.h>
#import <CoreLocation/CoreLocation.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import <QuartzCore/QuartzCore.h>
#import <Security/Security.h>
#import <StoreKit/StoreKit.h>
#import <SystemConfiguration/SystemConfiguration.h>
// Import parse framework
#import <Parse/Parse.h>
J'espère que cela t'aides.
Pour ajouter la structure Parse au projet Swift: ajoutez ces bibliothèques au projet Swift.
Collez ces frameworks de ParseSDK dans votre projet:
Ajoutez un ProjectName-Bridging-Header.h ( https://developer.Apple.com/library/ios/documentation/Swift/conceptual/buildingcocoaapps/MixandMatch.html ) ( https: //stackoverflow.com/a/24272431/1847511 ) fichier avec un tel contenu.
Ajouter un chemin pour lier l’en-tête de pontage:
Ajoutez le TestCode:
Lancer l'application.
La réponse à mon problème était différente. J'avais les chemins de recherche dans les paramètres de construction de mon projet définis sur récursifs alors qu'ils auraient dû être non récursif .
Dans mon cas, les cibles de recherche de structure de ma cible sont définies sur $ (hérité), ce qui signifie qu’il doit hériter du paramètre de mon projet.
Les chemins de recherche dans le cadre de mon projet ne comportaient qu'un seul chemin, $ PROJECT_DIR /../ External/** (avec les deux astérisques signifiant "rechercher ce dossier de manière récursive". Mon Parse.framework = le fichier était situé au niveau de base du dossier External.
Changer le chemin de récursif à non récursif a corrigé les choses pour moi. Très étrange...
La nouvelle version du framework Parse nécessite une mise à jour.
Tels que vous devez insérer libsqlite3.0.dylib dans Library Binary With Libraries et mettre à jour le fichier d'en-tête avec #import et #import
Utilisation des classes Objective-C dans Swift
Si vous envisagez d'importer du code dans une cible d'application (Mélange Swift et Objective-C dans un projet)), vous devez utiliser bridging header
fichier pour exposer le code Objective-C à Swift. [Mélanger Swift et Objective-C dans un projet]]
Dans ce post, je décrirai comment importer le framework Objective-C dans Swift code
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 de parapluie [Sur]Tout ajouter .h
fichiers dans un fichier parapluie qui sera ouvert au consommateur
#import "header_1.h"
#import "header_2.h"
Ajouter des fichiers d'implémentation .m
Select `.m` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files
Ajouter des fichiers d'en-tête .h
qui figuraient dans <product_name>.h
(header_1.h
, header_2.h
) [ne peut pas le faire][adhésion cible publique]
Select `.h` file -> Select File Inspectors Tab -> Target Membership -> Select the target and make it **public**
//or
Project editor -> select a target -> Build Phases -> Headers -> add files to the **public** zone
Construire le cadre - ⌘ Command + B ou Product -> Build
Remarque: assurez-vous de créer la structure pour la même architecture de processus que le code client.
Trouver 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
Headers
dossier avec: Headers
. Il y a des interfaces/définitions publiquesDrag and drop
le binaire dans le projet Xcode [Sur]
Embed binaries
[Bibliothèque non chargée][Lien vs Intégrer]
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file
J'ajouterai automatiquement le cadre à:
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 non trouvé][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
Module d'importation vers le Swift du client [nom_module]
import module_name