Objective-C et Swift : deux mondes, un seul projet
\n\nVous écrivez en Swift, mais vous avez à disposition une bibliothèque écrite en Objective-C, ou un code ancien mais éprouvé en ObjC. Une situation familière ? Ne vous inquiétez pas : Apple a prévu un excellent mécanisme pour faire collaborer ces deux langages. Dans cet article, nous allons voir comment appeler du code Objective-C depuis Swift — rapidement, simplement et sans maux de tête.
\n\nCette question est l'une des plus populaires sur Stack Overflow (des milliers de vues et des centaines de votes). Et ce n'est pas pour rien : savoir intégrer Objective-C dans Swift ouvre l'accès à un immense héritage de bibliothèques et de code écrits pendant des décennies de développement iOS. Comprenons enfin comment cela fonctionne.
\n\nQu'est-ce que le Bridging Header et pourquoi en a-t-on besoin ?
\n\nLe secret de l'amitié entre Swift et Objective-C est un fichier spécial appelé Bridging Header (en-tête de pont). C'est une sorte de traducteur : il indique à Swift quelles classes et fonctions en Objective-C sont disponibles et comment les appeler correctement.
\n\nLorsque vous créez un fichier de pont, le compilateur le prend automatiquement en charge et rend toutes les déclarations d'Objective-C visibles dans Swift. Il vous suffit d'importer les en-têtes ObjC dans ce fichier — et c'est prêt.
\n\nComment créer un Bridging Header dans Xcode
\n\nLa méthode la plus simple est de laisser Xcode le faire pour vous. Ajoutez simplement un nouveau fichier Objective-C à votre projet (File → New → File → Objective-C File). Xcode vous demandera : « Voulez-vous créer un Bridging Header ? » — répondez « Oui ». Ensuite, un fichier nommé YourProjectName-Bridging-Header.h apparaîtra dans le projet.
Si vous travaillez déjà sur un projet et souhaitez ajouter le pont manuellement, procédez comme suit :
\n\n- \n
- Créez un nouveau fichier d'en-tête (File → New → File → Header File) et nommez-le, par exemple,
MyProject-Bridging-Header.h. \n - Dans les paramètres du projet (Build Settings), recherchez le paramètre Objective-C Bridging Header et indiquez le chemin vers votre fichier. \n
Prêt. Maintenant, tout ce que vous écrirez dans ce fichier sera accessible dans Swift.
\n\nÉcrire une classe Objective-C et la connecter à Swift
\n\nCréons une classe simple en Objective-C qui saluera l'utilisateur. D'abord, le fichier d'en-tête (Greeter.h) :
// Greeter.h\n#import <Foundation/Foundation.h>\n\n@interface Greeter : NSObject\n\n- (NSString *)greetWithName:(NSString *)name;\n\n@end\n\n\nEt maintenant, l'implémentation (Greeter.m) :
// Greeter.m\n#import "Greeter.h"\n\n@implementation Greeter\n\n- (NSString *)greetWithName:(NSString *)name {\n return [NSString stringWithFormat:@"Bonjour, %@ ! Ravi de vous rencontrer.", name];\n}\n\n@end\n\n\nMaintenant, le plus important. Ouvrez votre Bridging Header (par exemple, MyProject-Bridging-Header.h) et ajoutez-y :
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n\n\nEt voilà ! Vous pouvez maintenant utiliser la classe Greeter dans Swift comme si elle était écrite en Swift :
// ViewController.swift\nimport UIKit\n\nclass ViewController: UIViewController {\n\n override func viewDidLoad() {\n super.viewDidLoad()\n \n let greeter = Greeter()\n let message = greeter.greet(withName: "Alexandre")\n print(message) // Affichera : "Bonjour, Alexandre ! Ravi de vous rencontrer."\n }\n}\n\n\nNotez que la méthode greetWithName: se transforme en Swift en greet(withName:). Il s'agit d'une adaptation automatique des noms de méthodes d'Objective-C au style Swift.
Travailler avec des frameworks et bibliothèques Objective-C
\n\nIl arrive souvent que vous deviez intégrer non pas votre propre code, mais une bibliothèque existante en Objective-C (par exemple, une ancienne version d'AFNetworking ou CocoaLumberjack). C'est encore plus simple :
\n\n- \n
- Installez la bibliothèque via CocoaPods, Carthage ou SPM. \n
- Importez ses en-têtes dans votre Bridging Header. \n
- Utilisez \n