Comment appeler le code Objective-C de Swift

Dans le nouveau langage Swift d’Apple, comment appelle-t-on le code Objective-C?

Apple a mentionné qu’ils pouvaient coexister dans une seule application, mais cela signifie-t-il que l’on pourrait techniquement réutiliser les anciennes classes créées dans Objective-C tout en construisant de nouvelles classes dans Swift?

Le raisonnement

Objective-C est un langage indépendant de la plate-forme, alors que Swift dépend de la plate-forme. L’écriture de code non dépendant de la plate-forme (bibliothèques de logique métier) dans Swift ne serait donc pas judicieuse. Cependant, écrire du code dépendant de la plate-forme (lié à l’interface par exemple) serait parfait. Ne pas dire que ce serait une bonne idée, mais c’est certainement un intérêt.

Utilisation des classes Objective-C dans Swift

** Si vous souhaitez utiliser une classe existante, effectuez l’ étape 2 , puis passez à l’ étape 5 . (Dans certains cas, j’ai dû append un #import explicite à un fichier Objective-C plus ancien.) **

Étape 1: Ajouter une implémentation Objective-C - .m

Ajoutez un fichier .m à votre classe et nommez-le CustomObject.m .

Étape 2: Ajouter un en-tête de pontage

Lorsque vous ajoutez votre fichier .m , vous serez probablement frappé par une invite qui ressemble à ceci:

Entrez la description de l'image ici

Cliquez sur OUI !

Si l'invite ne s'affiche pas ou si vous avez supprimé par erreur votre en-tête de pontage, ajoutez un nouveau fichier .h à votre projet et nommez-le <#YourProjectName#>-Bridging-Header.h .

Dans certaines situations, en particulier lorsque vous travaillez avec des frameworks Objective-C, vous n'ajoutez pas explicitement une classe Objective-C et Xcode ne trouve pas l'éditeur de liens. Dans ce cas, créez votre fichier .h nommé comme mentionné ci-dessus, puis assurez-vous de lier son chemin dans les parameters du projet de votre cible, comme suit:

Entrez la description de l'image ici

Remarque

Il est $(SRCROOT) de lier votre projet à l'aide de la macro $(SRCROOT) sorte que si vous déplacez votre projet ou travaillez dessus avec d'autres utilisateurs d'un référentiel distant, cela fonctionnera toujours. $(SRCROOT) peut être considéré comme le répertoire contenant votre fichier .xcodeproj. Cela pourrait ressembler à ceci:

 $(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h 

Étape 3: Ajouter un en-tête Objective-C - .h

Ajoutez un autre fichier .h et nommez-le CustomObject.h .

Étape 4: Construisez votre classe Objective-C

Dans CustomObject.h

 #import  @interface CustomObject : NSObject @property (strong, nonatomic) id someProperty; - (void) someMethod; @end 

Dans CustomObject.m

 #import "CustomObject.h" @implementation CustomObject - (void) someMethod { NSLog(@"SomeMethod Ran"); } @end 

Étape 5: Ajouter une classe à l'en-tête de pontage

Dans YourProject-Bridging-Header.h :

 #import "CustomObject.h" 

Étape 6: Utilisez votre object

Dans SomeSwiftFile.swift :

 var instanceOfCustomObject: CustomObject = CustomObject() instanceOfCustomObject.someProperty = "Hello World" println(instanceOfCustomObject.someProperty) instanceOfCustomObject.someMethod() 

Il n'est pas nécessaire d'importer explicitement; c'est à cela que sert l'en-tête de pontage.

Utilisation des classes rapides dans Objective-C

Étape 1: Créer une nouvelle classe Swift

Ajoutez un fichier .swift à votre projet et nommez-le MySwiftObject.swift .

Dans MySwiftObject.swift :

 import Foundation class MySwiftObject : NSObject { var someProperty: AnyObject = "Some Initializer Val" init() {} func someFunction(someArg:AnyObject) -> Ssortingng { var returnVal = "You sent me \(someArg)" return returnVal } } 

Étape 2: Importation de fichiers Swift dans la classe ObjC

Dans SomeRandomClass.m :

 #import "<#YourProjectName#>-Swift.h" 

Le fichier <#YourProjectName#>-Swift.h devrait déjà être créé automatiquement dans votre projet, même si vous ne pouvez pas le voir.

Étape 3: Utilisez votre classe

 MySwiftObject * myOb = [MySwiftObject new]; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); myOb.someProperty = @"Hello World"; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); NSSsortingng * retSsortingng = [myOb someFunction:@"Arg"]; NSLog(@"RetSsortingng: %@", retSsortingng); 

Remarque:

1. CodeCompletion ne se comportait pas aussi précisément que je le voudrais. Sur mon système, lancer une compilation rapide avec "cmd + r" semblait aider Swift à trouver une partie du code Objective-C et inversement.

2. Si vous ajoutez un fichier .swift à un projet plus ancien et obtenez une erreur: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , essayez de redémarrer complètement Xcode .

3. Alors qu'il était à l'origine possible d'utiliser des classes Swift pures dans Objective-C en utilisant le préfixe @objc , après Swift 2.0, cela n'est plus possible. Voir modifier l'historique pour l'explication originale. Si cette fonctionnalité est réactivée dans les futures versions de Swift, la réponse sera mise à jour en conséquence.

Voir le guide d’Apple sur l’ utilisation de Swift avec Cocoa et Objective-C . Ce guide explique comment utiliser le code Objective-C et C de Swift et vice versa et propose des recommandations sur la manière de convertir un projet ou de combiner des parties Objective-C / C et Swift dans un projet existant.

Le compilateur génère automatiquement la syntaxe Swift pour appeler les fonctions C et les méthodes Objective-C. Comme on le voit dans la documentation, cet Objective-C:

 UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; 

se transforme en ce code Swift:

 let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped) 

Xcode effectue également cette traduction à la volée – vous pouvez utiliser Open Quickly lors de l’édition d’un fichier Swift et taper un nom de classe Objective-C, et cela vous mènera à une version Swift-ified de l’en-tête de classe. (Vous pouvez également obtenir ceci en cliquant sur un symbole API dans un fichier Swift.) Et toute la documentation de référence de l’API dans les bibliothèques de développement iOS 8 et OS X v10.10 (Yosemite) est visible dans Objective-C et Swift. formulaires (par exemple UIView ).

Voici des instructions détaillées sur l’utilisation du code Objective-C (dans ce cas, un framework fourni par un tiers) dans un projet Swift:

  1. Ajoutez un fichier Objective-C à votre projet Swift en choisissant Fichier -> Nouveau -> Nouveau fichier -> Fichier Objective-C. Lors de la sauvegarde, Xcode vous demandera si vous souhaitez append un en-tête de pontage . Choisissez ” Oui “. Gif: append un fichier vide au projet et générer un en-tête de pontage http://www.derrrick.com/stackoverflow/1-empty-file.gif

En étapes simples:

  1. Une invite apparaît, puis cliquez sur OK … Si elle n’apparaît pas, alors nous la créons manuellement comme dans la suite … Créez un fichier d’en-tête à partir du source iOS et donnez le nom ProjectName-Bridging-Header (exemple: Test -Bridging-Header), puis aller dans la construction des parameters dans le code du compilateur Swift -> pont Objective-C append le nom du pont Objective-C .. (Test / Test-Bridging-Header.h). Oui, c’est complet.

  2. Supprimez éventuellement le fichier Objective-C que vous avez ajouté (nommé “Tout” dans l’image GIF ci-dessus). Vous n’en avez plus besoin.

  3. Ouvrez le fichier d’en-tête de pontage – le nom de fichier est de la forme [YourProject] -Bridging-Header.h . Il inclut un commentaire fourni par Xcode. Ajoutez une ligne de code pour le fichier Objective-C à inclure , par exemple une structure tierce. Par exemple, pour append Mixpanel à votre projet, vous devez append la ligne de code suivante au fichier d’en-tête de pontage:

      # Import "Mixpanel.h" 
  4. Désormais, dans n’importe quel fichier Swift, vous pouvez utiliser le code Objective-C existant, dans la syntaxe Swift (dans le cas de cet exemple, et vous pouvez appeler les méthodes SDK Mixpanel, etc.). Vous devez vous familiariser avec la manière dont Xcode traduit Objective-C en Swift. Le guide d’Apple est une lecture rapide. Ou voir cette réponse pour un résumé incomplet.

Exemple pour Mixpanel:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { Mixpanel.sharedInstanceWithToken("your-token") return true } 

C’est tout!

Remarque: Si vous supprimez le fichier d’en-tête de pontage de votre projet , veillez à vous rendre dans Paramètres de construction et à supprimer la valeur “En -tête de pont Objective-C ” sous “Générateur de compilateur – Génération de code”.

Vous pouvez lire le bon post Swift & Cocoapods . Fondamentalement, nous devons créer un fichier d’en-tête de pontage et y placer tous les en-têtes Objective-C. Et ensuite, nous devons le référencer depuis nos parameters de construction. Après cela, nous pouvons utiliser le code Objective-C.

 let manager = AFHTTPRequestOperationManager() manager.GET( "http://example.com/resources.json", parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in println("JSON: " + responseObject.description) }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error: " + error.localizedDescription) }) 

Jetez également un coup d’œil au document d’Apple intitulé Utilisation de Swift avec Cocoa et Objective-C .

J’ai écrit un simple projet Xcode 6 qui montre comment mélanger le code C ++, Objective-C et Swift:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

En particulier, l’exemple appelle une fonction Objective-C et C ++ à partir du Swift .

La clé est de créer un en-tête partagé, Project-Bridging-Header.h, et d’y placer les en-têtes Objective-C.

Veuillez télécharger le projet comme exemple complet.

Citation de la documentation :

Tout framework Objective-C (ou bibliothèque C) accessible en tant que module peut être importé directement dans Swift. Cela inclut tous les frameworks système Objective-C, tels que Foundation, UIKit et SpriteKit, ainsi que les bibliothèques C communes fournies avec le système. Par exemple, pour importer Foundation, ajoutez simplement cette instruction d’importation en haut du fichier Swift dans lequel vous travaillez:

import Foundation

Cette importation rend toutes les API de base, y compris NSDate, NSURL, NSMutableData et toutes leurs méthodes, propriétés et catégories, directement disponibles dans Swift.

Une dernière chose que j’aimerais append ici:

Je suis très reconnaissant à la réponse de @ Logan. Cela aide beaucoup à créer un fichier de pont et des configurations.

Mais après avoir fait toutes ces étapes, je n’ai toujours pas de classe Objective-C dans Swift.

J’ai utilisé la bibliothèque de cocoapods et l’ cocoapods intégrée dans mon projet. Qui est pod "pop" .

Donc, si vous utilisez des modules Objective-C dans Swift, il se peut que vous ne puissiez pas obtenir ou import les classes dans Swift.

La chose la plus simple à faire est de:

  1. Accédez au fichier -Bridging-Header et
  2. Remplacez l’instruction #import par @import ObjC_Framework

Par exemple: (Bibliothèque Pop)

Remplacer

 #import  

avec

 @import pop; 

Utilisez l’ clang import lorsque clang import ne fonctionne pas.

Juste une note pour quiconque essaie d’append une bibliothèque Objective-C à Swift: Vous devez append -ObjC dans Paramètres de construction -> Liaison -> Autres indicateurs de liaison .

Après avoir créé un en-tête de pontage, accédez à Paramètre de construction => Rechercher “En-tête de pontage Objective-C”.

Juste en dessous, vous trouverez le fichier “” Objective-C Generated Interface Header Name “.

Importez ce fichier dans votre contrôleur de vue.

Exemple: Dans mon cas: “Dauble-Swift.h”

description de l'image eEter ici

Cliquez sur le menu Nouveau fichier et choisissez la langue de sélection du fichier Objectif. À ce moment, il génère automatiquement un fichier “Objective-C Bridging Header” utilisé pour définir un nom de classe.

“En-tête de pontage Objective-C” sous “Compilateur Swift – Génération de code”.

  1. Créez un fichier .h à partir de NewFile -> Source -> fichier d’en-tête
  2. Ensuite, enregistrez le nom du fichier Your_Target_Name-Bridging-Header.h Les personnes ici commettent des erreurs en prenant leur nom de projet, mais il devrait s’agir du nom de la cible du projet si les deux sont différents, généralement ils sont identiques.
  3. Ensuite, dans les parameters de construction, recherchez l’indicateur Objective-C Bridging Header et placez l’adresse de votre fichier de pont nouvellement créé, vous pouvez le faire avec le clic droit sur le fichier -> show in finder -> faites glisser le fichier dans la zone de texte être peuplé.
  4. Utiliser #import Your_Objective-C_file.h
  5. Dans le fichier rapide, vous pouvez accéder au fichier ObjC mais dans un langage rapide uniquement.

Tout framework Objective-C (ou bibliothèque C) accessible en tant que module peut être importé directement dans Swift. Cela inclut tous les frameworks système Objective-C, tels que Foundation, UIKit et SpriteKit, ainsi que les bibliothèques C communes fournies avec le système. Par exemple, pour importer Foundation, ajoutez simplement cette instruction d’importation en haut du fichier Swift dans lequel vous travaillez:

 import Foundation 

Cette importation rend toutes les API de base, y compris NSDate, NSURL, NSMutableData et toutes leurs méthodes, propriétés et catégories, directement disponibles dans Swift.

Je l’ai pris à partir de la documentation d’Apple.

Approche bidirectionnelle pour utiliser objective-c objective-c

1

 1. Create bridge-header.h file in Xcode Project 2. import .h file in bridge-Header file 3. Set path of bridge-Header in Build settings. 3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you ) 2. import .h file in bridge-Header file 

Maintenant, c’est bon, merci

entrer la description de l'image ici J’ai ajouté le projet sur github qui inclut un petit échantillon pour appeler le code objective c de swift.

Appelez la classe ObjectiveC de swift

Dans le projet Swift 4.2 de Xcode 9.4, vous pouvez facilement append un fichier Objective-C. Suivez les étapes ci-dessous pour relier le fichier Objective-C au projet Swift.

Step_01: Créez un nouveau projet Xcode en utilisant le langage Swift:

File > New > Project > objc .

Step_02: Dans le projet Swift, ajoutez un nouveau fichier Objective-C:

File > New > File... > macOS > Objective-C File .

Step_03: Si vous ajoutez un nouveau fichier Objective-C dans le projet Swift pour la première fois, Xcode vous demande:

Would you like to configure an Objective-C bridging header ?

entrer la description de l'image ici

Step_04: Sélectionnez l’option:

Create Bridging Header .

Step_05: Un fichier correspondant sera généré avec un nom:

Objc-Bridging-Header.h .

entrer la description de l'image ici

Step_06: Maintenant, vous devez installer le chemin du fichier Bridge dans l’en-tête du pont. Dans Navigateur de projet, cliquez sur le projet avec le nom objc , puis choisissez:

Build Settings Objc-Bridging-Header.h > Objc-Bridging-Header.h Objective-C Bridging Header > Objc-Bridging-Header.h .

Step_07: Glissez-déposez votre Objc-Bridging-Header.h dans cette case pour générer un chemin de fichier.

entrer la description de l'image ici

Step_08: Ouvrez votre Objc-Bridging-Header.h et importez le fichier Objective-C que vous souhaitez utiliser dans votre fichier Swift.

 #import "SpecialObjcFile.m" 

Voici un contenu de SpecialObjcFile.m :

 #import  @interface Person: NSObject { @public bool busy; } @property bool busy; @end 

Step_09: Dans votre fichier Swift, vous pouvez maintenant utiliser une classe Objective-C:

 override func viewDidLoad() { super.viewDidLoad() let myObjcContent = Person() print(myObjcContent.busy) } 

entrer la description de l'image ici entrer la description de l'image ici