959 votes

comment s'appelle

Dans la nouvelle Swift de la langue d'Apple, comment fait-on appel code Objective-C?

Apple a indiqué qu'ils pourraient co-exister dans une application, mais est-ce à dire que l'on pourrait techniquement ré-utiliser les anciennes classes en Objective-C, tandis que la construction de nouvelles classes dans swift?

Le Raisonnement

Objective-C est une plate-forme indépendante de la langue, alors que Swift est dépend de la plateforme. L'écriture non-dépend de la plateforme de code (de la logique métier des bibliothèques) dans swift ne serait donc pas être sage. Cependant l'écriture dépend de la plateforme, dans le code (interface liées par exemple) serait parfaitement bien. Ne pas le dire serait une bonne idée, cependant il est certainement l'un des intérêts

1375voto

Logan Points 7458

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:

enter image description here

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:

enter image description here

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.

118voto

rickster Points 19870

Voir Apple guide pour l'Utilisation de Swift avec Cocoa et Objective-C. Ce guide décrit comment utiliser ObjC et du code C à partir de Swift et vice versa, et contient des recommandations pour la façon de convertir un projet ou mélanger et assortir ObjC/C et Swift pièces dans un projet existant.

Le compilateur génère automatiquement Swift syntaxe pour appeler des fonctions C et ObjC méthodes. Comme vu dans les docs, ce ObjC:

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

se transforme en cette Swift:

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

Xcode aussi cette traduction à la volée, vous pouvez utiliser Ouvrir Rapidement pendant l'édition d'un Swift fichier et saisissez un ObjC nom de la classe, et il va vous prendre pour une Swift-identifiés version de l'en-tête de classe. (Vous pouvez également l'obtenir en cmd-clic sur une API de symbole dans une Swift fichier.) Et tous la référence de l'API de la documentation dans l' iOS 8 et OS X Yosemite developer bibliothèques est visible dans les deux ObjC et Swift formes (par exemple, UIView).

38voto

Jake Lin Points 850

Vous pouvez lire ce gentil message Swift & Cocoapods. Fondamentalement, nous avons besoin de créer une passerelle fichier d'en-tête et de mettre tous objective-c en-têtes. Et puis nous avons besoin de faire référence à l'un de nos paramètres de construction. Après cela, nous pouvons utiliser l'objective-c du code.

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

Aussi jeter un oeil à Apple document à l'Aide de Swift avec Cocoa et Objective-C ainsi.

24voto

Gian Luigi Romita Points 161

J'ai écrit un simple Xcode 6 projet qui montrent comment mix C++, Objective-C et Swift code:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

En particulier, l'exemple de l'appel d'une Objective C et une fonction C++ à partir de la Swift.

La clé est de créer un partage de l'en-tête du Projet-un pont-d'en-Tête.h et de mettre l'Objective-C en-têtes.

S'il vous plaît télécharger le projet comme un exemple complet.

21voto

Gergo Erdosi Points 9712

Citation de la documentation:

Objective-C cadre (ou de la bibliothèque C) qui est accessible en tant que module peuvent être importés directement dans Swift. Cela comprend toutes les Objective-C système de cadres-comme la Fondation, UIKit, et SpriteKit -, ainsi que des bibliothèques C fourni avec le système. Pour exemple, pour importer de la Fondation, il suffit d'ajouter cette instruction import pour l' haut de la Swift de fichier dans lequel vous travaillez:

import Foundation

Cette importation fait tous de la Fondation Api-y compris NSDate, NSURL, NSMutableData, et l'ensemble de leurs méthodes, les propriétés et les catégories-directement disponible dans Swift.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X