Dans Swift, comment appelle-t-on le code Objective-C?
Apple a mentionné qu'ils pourraient coexister dans une application, mais cela signifie-t-il que l'on pourrait réutiliser techniquement les anciennes classes créées dans Objective-C lors de la construction de nouvelles classes dans Swift?
** Si vous souhaitez utiliser une classe existante, effectuez Étape 2 puis passez à Étape 5. (Dans certains cas, j'ai dû ajouter un #import <Foundation/Foundation.h
explicite à un fichier Objective-C plus ancien.) **
Ajoutez un fichier .m
à votre classe et nommez-le CustomObject.m
.
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 si vous avez 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, notamment lorsque vous travaillez avec des infrastructures 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 fichier .h
nommé comme indiqué ci-dessus, puis assurez-vous de lier son chemin d'accès dans les paramètres de projet de votre cible, comme suit:
Remarque
Il est recommandé de lier votre projet à l'aide de la macro $(SRCROOT)
afin que, si vous déplacez votre projet ou travaillez avec d'autres personnes à 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
Ajoutez un autre fichier .h
et nommez-le CustomObject.h
.
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
Dans YourProject-Bridging-Header.h
:
#import "CustomObject.h"
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.
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
}
}
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 le voyez pas.
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
// original
NSString * retString = [myOb someFunction:@"Arg"];
// xcode10 expands the external arg here
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];|
NSLog(@"RetString: %@", retString);
1. CodeCompletion ne se comportait pas aussi précisément que je le voudrais. Sur mon système, exécuter une construction 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 l'erreur: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, essayez complètement redémarrage de 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 l'historique d'édition pour l'explication originale. Si cette fonctionnalité est réactivée dans les futures versions Swift, la réponse sera mise à jour en conséquence.
Consultez le guide Apple intitulé tilisation de Swift avec Cocoa et Objective-C . Ce guide explique comment utiliser les codes Objective-C et C à partir de Swift et vice versa, et contient des recommandations sur la conversion d'un projet ou la combinaison d'éléments Objective-C/C et Swift. dans un projet existant.
Le compilateur génère automatiquement la syntaxe Swift pour l'appel des fonctions C et des 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 Ouvrir rapidement lors de la modification d'un fichier Swift et taper un nom de classe Objective-C. . (Vous pouvez également l'obtenir en cliquant sur cmd en cliquant sur un symbole d'API dans un fichier Swift.) Et toute la documentation de référence d'API dans iOS 8 et OS X Les bibliothèques de développement v10.10 (Yosemite) sont visibles sous les formes Objective-C et Swift (par exemple, UIView
).
Voici des instructions pas à pas pour utiliser le code Objective-C (dans ce cas, une structure fournie par un tiers) dans un projet Swift:
En étapes simples:
Une invite apparaît, puis cliquez sur OK ... S'il n'apparaît pas, nous le créons manuellement comme suit: Créez un fichier d'en-tête à partir de la source iOS et donnez le nom ProjectName-Bridging-Header (exemple: Test -Bridging-Header), puis accédez au paramètre de construction dans le Swift code du compilateur -> Le pont Objective-C ajoute le nom du pont Objective-C .. (Test/Test-Bridging-Header.h). Oui, c'est complet.
Supprimez éventuellement le fichier Objective-C que vous avez ajouté (nommé "rien" dans l'image GIF ci-dessus). Vous n'en avez plus besoin.
Ouvrez le fichier d'en-tête de pontage - le nom du fichier est de la forme [Votre projet] -Bridging-Header.h . Il inclut un commentaire fourni par Xcode. Ajoutez une ligne de code pour le fichier Objective-C que vous souhaitez inclure , tel qu'un framework tiers. Par exemple, pour ajouter Mixpanel à votre projet, vous devez ajouter la ligne de code suivante au fichier d’en-tête de pontage:
#import "Mixpanel.h"
Maintenant, dans tout fichier Swift, vous pouvez utiliser le code Objective-C existant, dans la syntaxe Swift (en le cas de cet exemple, et vous pouvez appeler les méthodes Mixpanel SDK, etc.). Vous devez vous familiariser avec la façon dont Xcode traduit Objective-C en Swift. Guide Apple est une lecture rapide. Ou voyez 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 ça!
Remarque: Si vous supprimez le fichier d'en-tête de pontage de votre projet , veillez à accéder à Paramètres de construction et à supprimer la valeur de " En-tête de pontage Objective-C "sous" Compilateur Swift - Génération de code ".
Vous pouvez lire le post de Nice Swift & Cocoapods. En gros, nous devons créer un fichier d’en-tête de pontage et y placer tous les en-têtes Objective-C. Et nous devons ensuite le référencer à partir de nos paramètres 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)
})
Consultez également le document d'Apple tilisation de Swift avec Cocoa et Objective-C.
J'ai écrit un simple projet Xcode 6 qui montre comment mélanger du 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 une fonction C++ à partir de 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
Grâce à cette importation, toutes les API Foundation (y compris NSDate, NSURL, NSMutableData et toutes leurs méthodes, propriétés et catégories) sont directement disponibles dans Swift.
Je suis très reconnaissant pour la réponse de @ Logan. Il est très utile de créer un fichier pont et des configurations.
Mais après toutes ces étapes, je ne reçois toujours pas de cours Objective-C à Swift.
J'ai utilisé la bibliothèque cocoapods
et l'ai intégrée à 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 simple à faire est de:
<YOUR-PROJECT>-Bridging-Header
et#import <ObjC_Framework>
par @import ObjC_Framework
Par exemple: (bibliothèque Pop)
Remplacer
#import <pop/POP.h>
avec
@import pop;
Utilisez clang import
lorsque #import
ne fonctionne pas.
Juste une note pour ceux qui essaient d’ajouter une bibliothèque Objective-C à Swift: Vous devriez ajouter - ObjC dans Configurer les paramètres -> Liaison -> Autres drapeaux de l'éditeur de liens .
Cliquez sur le menu Nouvea fichier, puis choisissez la langue de sélection de 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".
Dans le projet Swift 4.2.1 de Xcode 10.1, vous pouvez facilement ajouter un fichier Objective-C. Suivez les étapes ci-dessous pour relier le fichier Objective-C au projet Swift.
Étape_01: Créer un nouveau projet Xcode en utilisant Swift langue:
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 au tout début, Xcode vous demande:
Would you like to configure an Objective-C bridging header
?
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
.
Step_06: Vous devez maintenant configurer le chemin du fichier Bridge dans son en-tête. Dans Project Navigator, cliquez sur le projet nommé objc
, puis choisissez:
Build Settings
> Objective-C Bridging Header
> Objc-Bridging-Header.h
.
Step_07: Glissez-déposez votre Objc-Bridging-Header.h
dans cette zone pour générer un chemin de fichier.
Step_08: Ouvrez votre fichier 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 <Foundation/Foundation.h>
@interface Person: NSObject {
@public
bool busy;
}
@property
bool busy;
@end
Step_09: Dans votre fichier Swift, vous pouvez utiliser une classe Objective-C:
override func viewDidLoad() {
super.viewDidLoad()
let myObjcContent = Person()
print(myObjcContent.busy)
}
Ajouter l'en-tête Objective-C .h
et l'implémentation .m
Ajoutez les fichiers <FileName>.m
et <FileName>.h
à votre projet.
Ajouter un en-tête de pontage
Lors de l'ajout de votre fichier .m, cliquez sur "Oui" à l'invite Would you like to configure an Objective-C bridging header
Ajouter une classe à un en-tête de pontage
Dans YourProject-Bridging-Header.h
ajoutez une ligne #import "<FileName>.h"
<FileName>.Swift
qui étend NSObject
à votre projet#import "<#YourProjectName#>-Swift.h"
dans votre fichier Objective-CLire la suite ici
Approche à deux sens pour utiliser objectif-c objectif-c
1
2
Bon maintenantMerci
Apple a fourni un guide officiel dans cette doc: comment-appeler-objectif-c-code-de-Swift
Voici la partie pertinente:
Pour importer un ensemble de fichiers Objective-C dans le code Swift au sein de la même cible d'application, vous comptez sur un fichier d'en-tête de pontage Objective-C . pour exposer ces fichiers à Swift . Xcode vous propose de créer cet en-tête lorsque vous ajoutez un fichier Swift à une application Objective-C existante, ou un fichier Objective-C à une application Swift existante.
Si vous acceptez, Xcode crée le fichier d'en-tête de pontage avec le fichier que vous étiez en train de créer et nommez-le en utilisant le nom du module de votre produit suivi de "-Bridging-Header.h". Vous pouvez également créer vous-même un en-tête de pontage en choisissant Fichier> Nouveau> Fichier> [système d'exploitation]> Source> Fichier d'en-tête .
Editez l'en-tête de pontage pour exposer votre code Objective-C à votre code Swift:
Tous les en-têtes publics Objective-C répertoriés dans l'en-tête de pontage sont visibles pour Swift.
Logans answer fonctionne très bien, sauf dans le dernier Swift 5
il génère des erreurs de compilation. Voici le correctif pour les personnes qui travaillent sur Swift 5.
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val" as AnyObject
override init() {}
func someFunction(someArg:AnyObject) -> String {
let returnVal = "You sent me \(someArg)"
return returnVal
}
}