Comment appeler le code Objectif-C de Swift

dans le nouveau langage Swift D'Apple, Comment appelle-t-on le code objectif-C?

Apple a mentionné qu'ils pourraient coexister dans une application, mais cela signifie-t-il que l'on pourrait techniquement réutiliser les anciennes classes de L'Objectif-C tout en construisant de nouvelles classes dans Swift?

Le Raisonnement

objectif-C est un langage indépendant de la plate-forme, tandis que Swift est dépendant de la plate-forme. Ecrire un code non dépendant de la plate-forme (entreprise logic libraries) dans Swift ne serait donc pas sage. Cependant, écrire du code dépendant de la plate-forme dans it (interface liée par exemple) serait parfaitement correct. Ne pas le dire serait une bonne idée, cependant il est certainement un intérêt.

841
demandé sur Peter Mortensen 2014-06-03 00:05:42
la source

15 ответов

utilisant les Classes Objectif-C dans Swift

** Si vous avez une classe existante que vous souhaitez utiliser, exécuter Étape 2 et puis passer à Étape 5 . (Dans certains cas, j'ai dû ajouter un #import <Foundation/Foundation.h explicite à un ancien fichier objectif-C.) **

Étape 1: Ajouter La Mise En Œuvre De L'Objectif C -- .m

Ajouter un fichier .m à votre classe, et l'appeler CustomObject.m .

Étape 2: Ajouter L'En-Tête De Pont

en ajoutant votre fichier .m , vous serez probablement frappé par une invite qui ressemble à ceci:

Enter image description here

, Cliquez sur OUI !

si vous n'avez pas vu l'invite, ou si vous avez accidentellement supprimé votre en-tête passerelle, ajoutez un nouveau fichier .h à votre projet et nommez-le <#YourProjectName#>-Bridging-Header.h .

dans certaines situations, en particulier lorsque vous travaillez avec des cadres Objectif-C, vous n'ajoutez pas de classe objectif-c explicitement et Xcode ne peut pas trouver le linker. Dans ce cas, créez votre fichier .h nommé comme indiqué ci-dessus, puis assurez-vous de lier son chemin dans les paramètres de projet de votre cible comme suit:

Enter image description here

Note

C'est une bonne pratique pour relier votre projet en utilisant la macro $(SRCROOT) de sorte que si vous déplacez votre projet, ou travaillez dessus avec d'autres en utilisant un dépôt distant, il fonctionnera toujours. $(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 Un En-Tête Objectif-C.h

Ajouter un autre .h et l'appeler CustomObject.h .

Étape 4: Construisez votre Objectif-Classe 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 Pont

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()

il n'est pas nécessaire d'importer explicitement; c'est ce que l'en-tête de pont est pour.

utilisant les Classes Swift dans L'objectif-c

Étape 1: Créer Une Nouvelle Classe Swift

Ajouter un .swift fichier à votre projet, et l'appeler 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: Importer des 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);

Note:

1. la co-réalisation n'était pas aussi précise que je le souhaitais. Sur mon système, exécuter une compilation rapide avec "cmd + r" semblait aider Swift à trouver du code Objectif-C et vice versa.

2. si vous ajouter un .swift fichier à un projet plus ancien et obtenir l'erreur: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , essayer complètement redémarrage Xcode .

3. alors qu'il était à l'origine possible d'utiliser les classes Swift pures dans L'Objectif-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établie dans les versions futures de Swift, la réponse sera mise à jour en conséquence.

1237
répondu Logan 2017-05-23 14:33:24
la source

Voir Apple guide l'Utilisation de Swift avec Cocoa et Objective-C . Ce guide couvre la façon d'utiliser le code Objectif-C et C de Swift et vice versa et contient des recommandations sur la façon de convertir un projet ou de mélanger et faire correspondre les parties Objectif-C/C et Swift dans un projet existant.

le compilateur génère automatiquement la syntaxe Swift pour appeler les fonctions C et les méthodes Objective-C. Comme le montre la documentation, cet objectif-C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

se transforme en ce code Swift:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode fait également cette traduction à la volée - vous pouvez utiliser Ouvrir rapidement tout en éditant un fichier Swift et taper un nom de classe Objectif-C, et il vous mènera à une version enrichie par Swift de l'en-tête de classe. (Vous pouvez également obtenir cela par cmd-en cliquant sur un symbole API dans un fichier Swift.) Et toute la documentation de référence API dans le iOS 8 et OS X v10.10 (Yosemite) Les bibliothèques de développeurs sont visibles à la fois sous les formes Objective-C et Swift (par exemple UIView ).

102
répondu rickster 2016-10-29 13:49:06
la source

Voici des instructions étape par étape pour utiliser le code Objectif-C (dans ce cas, un cadre fourni par un tiers) dans un projet Swift:

  1. ajoutez n'importe quel fichier Objectif-C à votre projet Swift En choisissant Fichier -> Nouveau -> nouveau fichier -> fichier objectif-C. Lors de la sauvegarde, Xcode vous demandera si vous voulez ajouter un en-tête de pont . Choisissez ' Oui '. Gif: Ajouter un fichier vide à le projet et la génération de l'en-tête de pont http://www.derrrick.com/stackoverflow/1-empty-file.gif

par étapes simples:

  1. une invite apparaît, puis cliquez sur OK... Si elle n'apparaît pas, alors nous le créer manuellement comme dans le suivant... Créer un fichier d'en-tête à partir de iOS source et donner le nom ProjectName-Bridging-Header (exemple: Test-Bridging-Header), puis aller dans le paramètre build dans le Swift code du compilateur- > pont objectif-c ajouter le nom du pont objectif-C..(Test/Test-Un Pont-D'En-Tête.h.) Ouais, c'est complet.

  2. en option, supprimez le fichier objectif-C que vous avez ajouté (nommé" anything " dans l'image GIF ci-dessus). Vous n'avez pas besoin de plus.

  3. ouvrir le fichier d'en-tête de pont -- le nom du fichier est du formulaire [YourProject]-en-tête de Pont.h . Il comprend un commentaire fourni par Xcode. ajouter une ligne de code pour le fichier objectif-C que vous voulez inclure , comme un cadre tiers. Par exemple, pour ajouter Mixpanel à votre projet, vous devrez ajouter la ligne de code suivante à la transition fichier d'en-tête:

    #import "Mixpanel.h"
  4. maintenant dans n'importe quel fichier Swift vous pouvez utiliser le code Objectif-C existant, dans la syntaxe Swift (dans le cas de cet exemple, et vous peut appeler les méthodes Mixpanel SDK,etc.). Vous devez vous familiariser avec la façon dont Xcode traduit L'Objectif-C en Swift. d'Apple guide est une lecture rapide. Ou voir 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!

Note: si vous supprimez le fichier d'en-tête de pont de votre projet , assurez-vous D'aller dans Build Paramétrer et supprimer la valeur de " "en-tête de Pont objectif - C "sous"compilateur Swift-génération de Code".

49
répondu derrrick 2016-10-29 14:10:20
la source

vous pouvez lire le billet de nice Swift & Cocoapods . Fondamentalement, nous avons besoin de créer un fichier d'en-tête de pont et de mettre tous les en-têtes objectif-C. Et ensuite nous devons le référencer à partir de nos paramètres de construction. Après cela,nous pouvons utiliser le code objectif-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 aussi le document D'Apple utilisant Swift avec cacao et Objectif-C aussi.

30
répondu Jake Lin 2016-10-29 13:51:34
la source

j'ai écrit un simple projet Xcode 6 qui montre comment mélanger C++, Objective-C et le code 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++ du Swift .

la clé est de créer un en-tête partagé, Project-Bridging-Header.h, et de mettre les en-têtes de L'objectif C.

s'il vous Plaît télécharger le projet comme un exemple complet.

19
répondu Gian Luigi Romita 2016-10-29 14:03:32
la source

citation de la documentation :

tout cadre Objectif-C (ou bibliothèque C) qui est accessible sous forme de module peut être importé directement dans Swift. Cela comprend toutes les Les cadres du système de l'objectif C - comme la Fondation, L'UIKit et SpriteKit - ainsi que les bibliothèques C communes fournies avec le système. Pour exemple, pour importer la fondation, il suffit d'ajouter cette déclaration d'importation à haut du fichier Swift dans lequel vous travaillez:

import Foundation

cette importation rend tous les API de fondation - y compris NSDate, NSURL, NSMutableData, et toutes leurs méthodes, propriétés, et catégories - directement disponibles dans Swift.

17
répondu Gergo Erdosi 2014-06-03 00:43:55
la source

une dernière chose que je voudrais ajouter ici:

je suis très reconnaissant à la réponse de @Logan. Cela aide beaucoup à créer un fichier pont et des configurations.

mais après avoir fait toutes ces étapes, Je n'ai toujours pas de Cours Objectif-C à Swift.

j'ai utilisé la bibliothèque cocoapods et l'ai intégrée dans mon projet. Qui est pod "pop" .

donc, si vous utilisez des nacelles Objectif-C dans Swift, il peut y avoir une une chance que vous ne pouvez pas obtenir ou import les classes dans Swift.

la chose simple que vous avez à faire est:

  1. passer à <YOUR-PROJECT>-Bridging-Header fichier et
  2. remplacer la mention #import <ObjC_Framework> par @import ObjC_Framework

par exemple: (Pop library)

remplacer

#import <pop/POP.h>

avec

@import pop;

utiliser clang import lorsque #import ne fonctionne pas.

15
répondu Kampai 2016-10-29 14:14:49
la source

juste une note pour quiconque essaie d'ajouter une bibliothèque Objective-C à Swift: vous devez ajouter - ObjC dans Build Settings - > Linking - > autres pavillons Linker .

7
répondu david72 2016-10-29 14:17:13
la source

après avoir créé un en-tête de Pont, allez à Build Setting => rechercher"Objectif-C en-tête de Pont".

vous trouverez ci-dessous le fichier "" nom D'en-tête D'Interface généré par objectif-C."

importez ce fichier dans votre contrôleur de vue.

exemple: dans mon cas: "Dauble-Swift.h"

eEter image description here

3
répondu Avijit Nagare 2016-10-29 14:16:00
la source

cliquez sur le menu Nouveau et choisissez l'objectif de langue file select. À ce moment-là, il génère automatiquement un "en-tête de Pont Objectif-C" qui est utilisé pour définir un nom de classe.

"en-tête de Pont Objectif - C"sous" compilateur Swift-génération de Code".

2
répondu Yogesh shelke 2016-10-29 14:11:45
la source
  1. créer un .h fichier de NewFile -> Source -> fichier d'en-tête
  2. puis Enregistrer le nom du fichier Your_Target_Name-Bridging-Header.h les gens ici obtient erreur commune en prenant le nom de leur projet, mais il devrait être le nom de la cible du projet si dans le cas où les deux sont différents, généralement ils sont les mêmes.
  3. puis dans les paramètres de construction rechercher en-tête de Pont objectif-C drapeau et mettre l'adresse de votre nouvellement créé de transition fichier, vous pouvez le faire clic droit sur le fichier -> afficher dans le finder -> faites glisser le fichier dans la zone de texte puis l'adresse sera rempli.
  4. à l'Aide de #import Your_Objective-C_file.h
  5. dans le fichier swift, vous pouvez accéder au fichier ObjC mais uniquement en langue swift.
1
répondu Nish 2017-06-29 10:09:37
la source

tout cadre Objectif-C (ou bibliothèque C) qui est accessible en tant que module peut être importé directement dans Swift. Cela comprend tous les cadres du système Objectif-C-tels que Foundation, UIKit et SpriteKit-ainsi que les bibliothèques C communes fournies avec le système. Par exemple, pour importer Foundation, il suffit d'ajouter cette déclaration d'importation en haut du fichier Swift dans lequel vous travaillez:

import Foundation

cette importation rend tous les APIs de la Fondation-y compris NSDate, NSURL, NSMutableData, et toutes leurs méthodes, propriétés et catégories-directement disponibles dans Swift.

j'ai pris ceci de la documentation D'Apple.

0
répondu Peter Mortensen 2016-10-29 14:20:00
la source

approche bidirectionnelle pour utiliser l'objectif-c objectif-c

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file

bon Maintenant aller Merci

0
répondu Sanjay Mali 2018-04-13 12:39:37
la source

enter image description here j'ai ajouté le projet sur GitHub qui inclut un petit échantillon pour appeler le code objectif c de swift.

Appel ObjectiveC classe de swift

0
répondu CrazyPro007 2018-05-19 19:27:52
la source

dans le projet Swift 4.2 dans Xcode 9.4, vous pouvez facilement ajouter un fichier objectif-C. Suivez les étapes ci-dessous pour relier le fichier Objectif-C au projet Swift.

Step_01: créer un nouveau projet Xcode en utilisant le langage Swift:

File > New > Project > objc .

Step_02: dans le projet Swift, ajouter un nouveau fichier objectif-c:

File > New > File... > macOS > Objective-C File .

Step_03: si vous ajoutez un nouveau fichier Objectif-C dans le projet Swift pour la première fois, Xcode vous demande:

Would you like to configure an Objective-C bridging header ?

enter image description here

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 .

enter image description here

Step_06: Maintenant, vous devez configurer le chemin du fichier de pont dans l'en-tête de pont. Dans Project Navigator cliquez sur projet avec le nom objc et choisissez ensuite:

Build Settings > Objective-C Bridging Header > Objc-Bridging-Header.h .

Step_07: glissez votre Objc-Bridging-Header.h dans cette case pour générer un chemin de fichier.

enter image description here

Step_08: ouvrez votre fichier Objc-Bridging-Header.h et importez le fichier objectif-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: maintenant dans votre fichier Swift, vous pouvez utiliser une classe objectif-C:

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}

enter image description here enter image description here

0
répondu Gigantic 2018-06-13 00:43:00
la source

Autres questions sur