Utilisation de classes Objective-C dans Swift
Si vous avez une classe existante que vous souhaitez utiliser, effectuez l' étape 2 , puis passez à l' étape 5 . (Dans certains cas, j'ai dû ajouter un explicite #import <Foundation/Foundation.h
à un fichier Objective-C plus ancien.)
Étape 1: Ajouter une implémentation Objective-C - .m
Ajoutez un .m
fichier à votre classe et nommez-le CustomObject.m
.
Étape 2: ajouter un en-tête de pontage
Lors de l'ajout de votre .m
fichier, 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 .h
fichier à 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 peut pas trouver l'éditeur de liens. Dans ce cas, créez votre .h
fichier nommé comme mentionné ci-dessus, puis assurez-vous de lier son chemin dans les paramètres de projet de votre cible comme suit:
Remarque:
Il est recommandé de lier votre projet à l'aide de la $(SRCROOT)
macro de sorte que si vous déplacez votre projet ou travaillez dessus avec d'autres à l'aide d'un référentiel distant, il 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 .h
fichier et nommez-le CustomObject.h
.
Étape 4: Créez 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 une 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()
instanceOfCustomObject.someProperty = "Hello World"
print(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 de classes Swift dans Objective-C
Étape 1: créer une nouvelle classe Swift
Ajoutez un .swift
fichier à votre projet et nommez-le MySwiftObject.swift
.
Dans MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
Étape 2: importer des fichiers Swift dans la classe ObjC
Dans SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Le fichier: <#YourProjectName#>-Swift.h
doit déjà être créé automatiquement dans votre projet, même si vous ne le voyez pas.
É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 someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Remarques:
Si la complétion de code ne se comporte pas comme prévu, essayez d'exécuter une construction rapide avec ⌘⇧Rpour aider Xcode à trouver une partie du code Objective-C dans un contexte Swift et vice versa.
Si vous ajoutez un .swift
fichier à un ancien projet et obtenez l'erreur dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, essayez de redémarrer complètement Xcode .
Alors qu'il était à l'origine possible d'utiliser des classes Swift pures (pas des descendants de NSObject
) qui sont visibles pour Objective-C en utilisant le @objc
préfixe, ce n'est plus possible. Maintenant, pour être visible dans Objective-C, l'objet Swift doit soit être une classe conforme à NSObjectProtocol
(la façon la plus simple de le faire est d'hériter de NSObject
), soit être enum
marqué @objc
avec une valeur brute d'un type entier comme Int
. Vous pouvez afficher l'historique des modifications pour un exemple de code Swift 1.x utilisant @objc
sans ces restrictions.