iOS
Interopérabilité Swift et Objective-C
Recherche…
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û ajouter un
#import <Foundation/Foundation.h
explicite à un fichier ObjC 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:
Cliquez sur OUI !
Si vous n'avez pas vu l'invite ou supprimé accidentellement 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 ObjC, 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 paramètres du projet de votre cible, comme suit:
Remarque
Il est $(SRCROOT)
de lier votre projet à l'aide de la macro $(SRCROOT)
pour que, si vous déplacez votre projet ou que vous le $(SRCROOT)
avec d'autres utilisateurs à l'aide d'un dépôt à distance, cela fonctionne 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 <Foundation/Foundation.h>
@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 la classe à l'en-tête de pontage
Dans YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Étape 6: Utilisez votre objet
Dans SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Pas besoin d'importer explicitement, c'est ce que l'en-tête de pont est pour.
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) -> String {
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);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);
Remarque:
1. CodeCompletion ne se comportait pas aussi précisément que je le voudrais. Sur mon système, exécuter une compilation rapide avec "cmd + r" semblait aider Swift à trouver une partie du code Objc et vice versa.
2. Si vous ajoutez le 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.