En Objective-C Classes en Swift
**
Si vous avez une classe existante que vous souhaitez utiliser, effectuez l'Étape 2 , puis passez à l' Étape 5. (Pour certains cas, j'ai dû ajouter une explicite #import <Foundation/Foundation.h
d'une ancienne ObjC Fichier)
**
Étape 1: Ajouter De L'Objective-C Mise En Œuvre -- .m
Ajouter un .m
le fichier à votre classe, et nommez - CustomObject.m
Étape 2: Ajouter Des Transition En-Tête
Lors de l'ajout d' .m
le fichier, vous aurez probablement être frappé avec une invite de commande qui ressemble à ceci:
Cliquez sur OUI !
Si vous ne voyez pas l'invite de commandes, ou accidentellement supprimés de votre en-tête de transition, ajouter un nouveau .h
fichier à votre projet et nommez - <#YourProjectName#>-Bridging-Header.h
Dans certaines situations, en particulier lorsque vous travaillez avec ObjC cadres, vous n'ajoutez pas un Objectif-C classe explicitement et Xcode ne pouvez pas trouver l'éditeur de liens. Dans ce cas, créez votre .h
fichier nommé comme mentionné ci-dessus, alors assurez-vous de créer un lien entre son chemin dans la cible du projet, les paramètres comme ceci:
Note
Il est recommandé de relier votre projet à l'aide de l' $(SRCROOT)
macro de sorte que si vous déplacez votre projet, ou de travailler avec les autres en utilisant une distance repo, il faudra encore travailler. $(SRCROOT)
peut être considéré comme le répertoire qui contient votre .xcodeproj fichier. Il pourrait ressembler à ceci:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Étape 3: Ajouter Objective-C En-Tête -- .h
Ajouter un autre .h
fichier et nommez - CustomObject.h
Etape 4: Construire votre Objectif-Classe C
En CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
En CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Étape 5: Ajouter une Classe de Transition-d'en-Tête
En YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Étape 6: Utilisation de votre Objet
En SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Pas besoin d'importer de façon explicite, c'est ce que le pont d'en-tête de est pour.
L'utilisation de Swift Classes en Objective-C
Étape 1: Créer Un Nouveau Swift Classe
Ajouter un .swift
fichier à votre projet et nommez - MySwiftObject.swift
En 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: Importer Swift Fichiers ObjC Classe
En 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 pouvez pas le voir.
Étape 3: Utilisation de 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);
À l'aide de PURE Swift Classes en Objective-C
Comme l'a souligné @TomášLinhart dans les commentaires, "Pour être accessibles et utilisables en Objective-C, Swift classe doit être un descendant d'un Objectif-de classe C ou elle doit être marquée @objc
." Parce que notre premier exemple est un descendant d' NSObject
, le compilateur le fait automatiquement. Regardons un exemple de classe qui n'est pas un descendant de l'Objective-C de Classe.
Étape 1: Créer Un Nouveau Swift Classe
Ajouter un .swift
fichier à votre projet et nommez - PureSwiftObject.swift
En PureSwiftObject.swift
:
import Foundation
// Note '@objc' prefix
@objc class PureSwiftObject {
var name: String
init(name: String) {
self.name = name
}
// Needed to add a class level initializer
class func newInstanceNamed(name: String) -> PureSwiftObject {
return PureSwiftObject(name: name)
}
// Just a method for demonstration
func someMethod() {
println("Some method ran in pure swift object")
}
}
Pour cela, j'ai créer une classe d'initialiseur appelé " newInstanceNamed:'. Parce que cette classe n'est plus un descendant d' NSObject
, elle n'a plus accès à "alloc" ou "nouveau". Il y a peut être une autre solution, mais c'est le seul moyen que j'ai trouvé. Je n'ai pas trouvé de mention explicite de ce dans les docs. Si vous le faites, et c'est en contradiction avec mon approche, dites-le moi et je vais mettre à jour la réponse à se conformer à la proposition de style.
Étape 2: Importer Swift Fichiers ObjC Classe
En SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
(si vous ne l'avez pas déjà fait)
Étape 3: Utilisation de votre pure swift classe
PureSwiftObject * pureSwiftObject = [PureSwiftObject newInstanceNamed:@"Janet"];
NSLog(@"PureSwiftNamed: %@", pureSwiftObject.name);
[pureSwiftObject someMethod];
Note:
1. CodeCompletion n'était pas de se comporter de façon aussi précise que j'aimerais qu'il. Sur mon système, l'exécution d'une construction rapide w/ "cmd + r" semblait aider Swift trouver quelques-uns des Objc code et vice versa.
2. Si vous ajoutez .swift
le fichier à un ancien projet et obtenez l'erreur: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, essayez complètement le redémarrage de Xcode.