Question Comment appeler le code Objective-C de Swift


Dans le nouveau langage Swift d'Apple, 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 d'Objective-C tout en construisant de nouvelles classes dans Swift?

Le raisonnement

Objective-C est un langage indépendant de la plate-forme, tandis que Swift dépend de la plate-forme. L'écriture de code non dépendant de la plateforme (bibliothèques logiques métier) dans Swift ne serait donc pas judicieuse. Cependant, l'écriture de code dépendant de la plate-forme (interface liée par exemple) serait parfaitement bien. Pour ne pas dire que ce serait une bonne idée, mais c'est certainement un intérêt.


818
2018-06-02 20:05


origine


Réponses:


 Utilisation de classes Objective-C dans Swift

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

 Étape 1: Ajouter une implémentation Objective-C - .m

Ajouter un .m déposer dans votre classe, et nommez-le CustomObject.m.

 Étape 2: Ajouter un en-tête de pontage

Lorsque vous ajoutez votre .m fichier, vous serez probablement frappé avec une invite qui ressemble à ceci:

Enter image description here

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 de classe Objective-C et Xcode ne trouve pas 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 du projet de votre cible comme suit:

Enter image description here

Remarque

Il est recommandé de lier votre projet à l'aide de $(SRCROOT) macro si vous déplacez votre projet, ou si vous travaillez dessus avec d'autres utilisateurs en utilisant un référentiel distant, cela fonctionnera toujours. $(SRCROOT) peut être considéré comme le répertoire qui contient votre fichier .xcodeproj. Cela pourrait ressembler à ceci:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

 Étape 3: Ajouter l'en-tête Objective-C - .h

Ajouter un autre .h fichier 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 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 = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

Il n'y a pas besoin d'importer explicitement; c'est à ça que sert l'en-tête de pontage.

 Utiliser les classes Swift en Objective-C

 Étape 1: Créer une nouvelle classe Swift

Ajouter un .swift fichier à 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 cours

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 construction rapide avec "cmd + r" semblait aider Swift à trouver une partie du code Objective-C et vice versa.

2. Si vous ajoutez un .swift déposer dans un projet plus ancien et obtenir une erreur: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, essayez complètement redémarrer Xcode.

3. Alors qu'il était à l'origine possible d'utiliser des classes Swift pur en Objective-C en utilisant le @objc préfixe, après Swift 2.0, ce n'est plus possible. Voir l'historique d'édition 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.


1212
2018-06-03 00:12



Voir le guide d'Apple pour Utiliser Swift avec du cacao et Objective-C. Ce guide explique comment utiliser les codes Objective-C et C de Swift et vice-versa et contient des recommandations sur la façon de convertir un projet ou de combiner des parties Objective-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 vu dans 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 effectue également cette traduction à la volée - vous pouvez utiliser Open Quickly lors de la modification d'un fichier Swift et saisir un nom de classe Objective-C, ce qui vous amènera à une version Swift-ified de l'en-tête de la classe. (Vous pouvez également obtenir ceci en cliquant sur un symbole API dans un fichier Swift.) Et toute la documentation de référence de l'API dans le iOS 8 et OS X v10.10 (Yosemite) Les bibliothèques de développeurs sont visibles dans les formulaires Objective-C et Swift (par ex. UIView).


101
2018-06-02 20:43



Voici des instructions pas à pas pour utiliser le code Objective-C (dans ce cas, un framework fourni par un tiers) dans un projet Swift:

  1. Ajoutez un fichier Objective-C à votre projet Swift en choisissant Fichier -> Nouveau -> Nouveau fichier -> Fichier Objective-C. Lors de l'enregistrement, Xcode vous demandera si vous souhaitez ajouter un en-tête de pontage. Choisissez 'Oui'. Gif: ajout de fichier vide au projet et génération d'en-tête de pontage http://www.derrrick.com/stackoverflow/1-empty-file.gif

En quelques étapes simples:

  1. Une invite s'affiche, puis cliquez sur OK ... Si elle n'apparaît pas, nous la créons manuellement comme suit ... Créez un fichier d'en-tête à partir de la source iOS et nommez ProjectName-Bridging-Header (exemple: Test -Bridging-Header), puis allez dans le paramètre de compilation Swift -> le pont Objective-C ajoute le nom du pont Objective-C .. (Test / Test-Bridging-Header.h). Oui, c'est complet.

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

  3. Ouvrez le fichier d'en-tête de pontage - le nom de fichier est de la forme [YourProject] -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 cadre de 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"
  4. Maintenant, dans n'importe quel fichier Swift, vous pouvez utiliser le code Objective-C existant, dans la syntaxe Swift (dans le cas de cet exemple, vous pouvez appeler les méthodes Mixpanel SDK, etc.). Vous devez vous familiariser avec la manière dont Xcode traduit Objective-C en Swift. Le guide d'Apple 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 tout!

Remarque: Si vous supprimez le fichier d'en-tête de pontage de votre projet, assurez-vous d'aller dans les paramètres de construction et supprimez la valeur pour "Objective-C Bridging Header"sous" compilateur rapide - génération de code ".


49
2018-02-12 19:34



Vous pouvez lire le bon post Swift et Cocoapodes. Fondamentalement, nous devons créer un fichier d'en-tête de pontage et y placer tous les en-têtes Objective-C. Et puis nous devons 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)
  })

Regardez aussi le document d'Apple Utiliser Swift avec du cacao et Objective-C ainsi que.


30
2018-06-04 02:11



J'ai écrit un simple projet Xcode 6 qui montre comment mixer 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 C ++ à partir du Swift.

La clé consiste à créer un en-tête partagé, Project-Bridging-Header.h, et à y placer les en-têtes Objective-C.

Veuillez télécharger le projet en tant qu'exemple complet.


19
2018-06-13 10:10



Citation du Documentation:

Tout framework Objective-C (ou bibliothèque C) accessible en module   peut être importé directement dans Swift. Cela comprend tous les   Les systèmes de système Objective-C, tels que Foundation, UIKit et   SpriteKit - ainsi que les bibliothèques C communes fournies avec le système. Pour   Par exemple, pour importer Foundation, ajoutez simplement cette instruction d'import au   En haut du fichier Swift dans lequel vous travaillez:

import Foundation

Cette importation fait toutes les API Foundation, y compris NSDate, NSURL,   NSMutableData et toutes leurs méthodes, propriétés et   catégories-directement disponibles dans Swift.


17
2018-06-02 20:43



Une dernière chose que j'aimerais ajouter ici:

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

Mais après avoir fait toutes ces étapes, je ne reçois toujours pas de classe Objective-C dans Swift.

J'ai utilisé le cocoapods bibliothèque et intégré dans mon projet. Lequel est pod "pop".

Donc, si vous utilisez des pods Objective-C dans Swift, il est possible que vous ne puissiez pas obtenir import les classes dans Swift.

La simple chose que vous devez faire est:

  1. Aller à <YOUR-PROJECT>-Bridging-Header fichier et
  2. Remplacer la déclaration #import <ObjC_Framework> à @import ObjC_Framework

Par exemple: (Bibliothèque Pop)

Remplacer

#import <pop/POP.h>

avec

@import pop;

Utilisation clang import quand #import ne fonctionne pas.


15
2017-09-16 07:00



Juste une note pour celui qui essaie d'ajouter une bibliothèque Objective-C à Swift: Vous devriez ajouter -ObjC dans Paramètres de construction -> Mise en relation -> Autres drapeaux de lieur.


7
2018-03-20 17:53



Après avoir créé un en-tête Bridging, accédez à Build Setting => Rechercher "Objective-C Bridging Header".

Juste en dessous, vous trouverez le fichier "" Objective-C Generated Interface Header Name ".

Importez ce fichier dans votre contrôleur de vue.

Exemple: Dans mon cas: "Dauble-Swift.h"

eEter image description here


3
2017-11-25 08:29



Clique sur le Nouveau menu fichier, et choisi le fichier sélectionnez la langue Objectif. À ce moment, il génère automatiquement un fichier "Objective-C Bridging Header" qui est utilisé pour définir un nom de classe.

"Objective-C Bridging Header" sous "Swift Compiler - Génération de code".


2
2017-09-10 12:16



  1. Créez un fichier .h à partir de NewFile -> Source -> fichier d'en-tête
  2. Puis enregistrez le nom du fichier Your_Target_Name-Bridging-Header.h  Les gens ici se trompent souvent en prenant leur nom de projet mais ce devrait être le nom de la cible du projet si les deux sont différents, généralement ils sont identiques.
  3. Ensuite, dans les paramètres de construction, recherchez Objective-C Bridging Header drapeau et mettre l'adresse de votre nouveau fichier de pontage, vous pouvez le faire à droite cliquez sur le fichier -> show in finder -> faites glisser le fichier dans la zone de texte, puis l'adresse sera remplie.
  4. Utiliser #import Your_Objective-C_file.h
  5. Dans le fichier swift, vous pouvez accéder au fichier ObjC mais uniquement en langage rapide.

1
2018-06-29 06:38