Dans Swift, comment appelle-t-on le code Objective-C?
Apple a mentionné qu'ils pouvaient coexister dans une seule application, mais cela signifie-t-il que l'on pourrait techniquement réutiliser les anciennes classes faites en Objective-C tout en construisant de nouvelles classes dans Swift?
objective-c
swift
David Mulder
la source
la source
Réponses:
Utilisation de classes Objective-C dans Swift
Étape 1: Ajouter une implémentation Objective-C - .m
Ajoutez un
.m
fichier à votre classe et nommez-leCustomObject.m
.Étape 2: ajouter un en-tête de pontage
Lors de l'ajout de votre
.m
fichier, vous serez probablement frappé par une invite qui ressemble à ceci: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 une classe Objective-C et Xcode ne peut pas trouver 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 de projet de votre cible comme suit:Remarque:
Il est recommandé de lier votre projet à l'aide de la
$(SRCROOT)
macro de sorte que si vous déplacez votre projet ou travaillez dessus avec d'autres à 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:Étape 3: ajouter un en-tête Objective-C - .h
Ajoutez un autre
.h
fichier et nommez-leCustomObject.h
.Étape 4: Créez votre classe Objective-C
Dans
CustomObject.h
Dans
CustomObject.m
Étape 5: ajouter une classe à l'en-tête de pontage
Dans
YourProject-Bridging-Header.h
:Étape 6: utilisez votre objet
Dans
SomeSwiftFile.swift
:Il n'est pas nécessaire d'importer explicitement; c'est à cela que sert l'en-tête de pontage.
Utilisation de classes Swift dans Objective-C
Étape 1: créer une nouvelle classe Swift
Ajoutez un
.swift
fichier à votre projet et nommez-leMySwiftObject.swift
.Dans
MySwiftObject.swift
:Étape 2: importer des fichiers Swift dans la classe ObjC
Dans
SomeRandomClass.m
:Le fichier:
<#YourProjectName#>-Swift.h
doit déjà être créé automatiquement dans votre projet, même si vous ne le voyez pas.Étape 3: utilisez votre classe
Remarques:
Si la complétion de code ne se comporte pas comme prévu, essayez d'exécuter une construction rapide avec ⌘⇧Rpour aider Xcode à trouver une partie du code Objective-C dans un contexte Swift et vice versa.
Si vous ajoutez un
.swift
fichier à un ancien projet et obtenez l'erreurdyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, essayez de redémarrer complètement Xcode .Alors qu'il était à l'origine possible d'utiliser des classes Swift pures (pas des descendants de
NSObject
) qui sont visibles pour Objective-C en utilisant le@objc
préfixe, ce n'est plus possible. Maintenant, pour être visible dans Objective-C, l'objet Swift doit soit être une classe conforme àNSObjectProtocol
(la façon la plus simple de le faire est d'hériter deNSObject
), soit êtreenum
marqué@objc
avec une valeur brute d'un type entier commeInt
. Vous pouvez afficher l'historique des modifications pour un exemple de code Swift 1.x utilisant@objc
sans ces restrictions.la source
Consultez le guide d'Apple sur l' utilisation de Swift avec Cocoa et Objective-C . Ce guide explique comment utiliser le code Objective-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 de faire correspondre des pièces 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 Objective-C:
se transforme en ce code Swift:
Xcode effectue également cette traduction à la volée - vous pouvez utiliser Ouvrir rapidement pendant la modification d'un fichier Swift et taper un nom de classe Objective-C, et cela vous amènera à une version Swift-ified de l'en-tête de classe. (Vous pouvez également l'obtenir en cliquant sur un symbole d'API dans un fichier Swift.) Et toute la documentation de référence de l'API dans les bibliothèques de développement iOS 8 et OS X v10.10 (Yosemite) est visible dans Objective-C et Swift formes (par exemple
UIView
).la source
Voici des instructions pas à pas pour utiliser le code Objective-C (dans ce cas, un framework fourni par un tiers) dans un projet Swift:
En quelques étapes simples:
Une invite apparaît, puis cliquez sur OK ... S'il n'apparaît pas, nous le créons manuellement comme dans l'exemple suivant ... 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 génération dans le code du compilateur Swift -> Pont Objective-C, ajoutez le nom du pont Objective-C .. (Test / Test-Bridging-Header.h). Ouais, c'est complet.
Facultativement, supprimez le fichier Objective-C que vous avez ajouté (nommé "n'importe quoi" dans l'image GIF ci-dessus). Vous n'en avez plus besoin.
Ouvrez le fichier d'en-tête de pontage - le nom de fichier est au format [YourProject] -Bridging-Header.h . Il comprend 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 devrez ajouter la ligne de code suivante au fichier d'en-tête de pontage:
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, 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. Le guide d'Apple est une lecture rapide. Ou consultez cette réponse pour un résumé incomplet.
Exemple pour Mixpanel:
C'est ça!
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 "En -tête de pontage Objective-C " sous "Compilateur Swift - Génération de code".
la source
Vous pouvez lire le bel article Swift & Cocoapods . 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.
Consultez également le document d'Apple sur l' utilisation de Swift avec Cocoa et Objective-C .
la source
J'ai écrit un projet Xcode 6 simple qui montre comment mélanger le code C ++, Objective-C et Swift:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
En particulier, l'exemple appelle un Objective-C et une fonction 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 comme exemple complet.
la source
J'aimerais ajouter une chose ici:
Je suis très reconnaissant pour la réponse de @ Logan. Cela aide beaucoup à créer un fichier bridge 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é la
cocoapods
bibliothèque et l' ai intégrée à mon projet. Ce qui estpod "pop"
.Donc, si vous utilisez des pods Objective-C dans Swift, il est possible que vous ne puissiez pas accéder
import
aux classes ou dans Swift.La chose simple que vous devez faire est:
<YOUR-PROJECT>-Bridging-Header
fichier et#import <ObjC_Framework>
par@import ObjC_Framework
Par exemple: (Bibliothèque Pop)
Remplacer
avec
À utiliser
clang import
lorsque#import
ne fonctionne pas.la source
Citation de la documentation :
la source
Juste une note pour quiconque essaie d'ajouter une bibliothèque Objective-C à Swift: vous devez ajouter -ObjC dans les paramètres de construction -> Liaison -> Autres indicateurs de l' éditeur de liens .
la source
Après avoir créé un en-tête de pontage, accédez à Build Setting => Search for "Objective-C Bridging Header".
Juste en dessous, vous trouverez le fichier "" Nom d'en-tête d'interface généré par Objective-C ".
Importez ce fichier dans votre contrôleur de vue.
Exemple: dans mon cas: "Dauble-Swift.h"
la source
Cliquez sur le menu Nouveau fichier et choisissez Fichier Sélectionner la langue Objectif. À ce moment, il génère automatiquement un fichier "En-tête de pontage Objective-C" qui est utilisé pour définir un nom de classe.
"En-tête de pontage Objective-C" sous "Compilateur Swift - Génération de code".
la source
la source
J'ai ajouté le projet sur github qui inclut un petit échantillon pour appeler le code objectif c de swift.
Appelez la classe ObjectiveC depuis swift
la source
Dans le projet Swift 4.2.1 dans 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éez un nouveau projet Xcode en utilisant le langage Swift:
File
>New
>Project
>objc
.Étape_02: dans le projet Swift, ajoutez un nouveau fichier Objective-C:
File
>New
>File...
>macOS
>Objective-C File
.Étape_03: Si vous ajoutez un nouveau fichier Objective-C dans le projet Swift à la toute première fois, Xcode vous demande:
Would you like to configure an Objective-C bridging header
?Étape_04: sélectionnez l'option:
Create Bridging Header
.Étape_05: Un fichier correspondant sera généré avec un nom:
Objc-Bridging-Header.h
.Étape_06: Maintenant, vous devez configurer le chemin du fichier Bridge dans l'en-tête du pont. Dans Project Navigator, cliquez sur projet avec nom
objc
, puis choisissez:Build Settings
>Objective-C Bridging Header
>Objc-Bridging-Header.h
.Étape_07: Glissez-déposez votre
Objc-Bridging-Header.h
dans cette boîte pour générer un chemin de fichier.Étape_08: Ouvrez votre
Objc-Bridging-Header.h
fichier et importez le fichier Objective-C que vous souhaitez utiliser dans votre fichier Swift.Voici un contenu de
SpecialObjcFile.m
:Étape_09: Maintenant dans votre fichier Swift, vous pouvez utiliser une classe Objective-C:
la source
La réponse Logans fonctionne correctement, sauf dans la dernière version
Swift 5
elle donne une erreur de compilation. Voici le correctif pour les personnes qui travaillent sur Swift 5.Swift 5
la source
Consommateur rapide, producteur Objective-C
Ajouter un en-tête
.h
et des.m
fichiers d' implémentation - Fichier de classe Cocoa (Objective-C)Par exemple
MyFileName
configurer l'en-tête de pontage
Lorsque vous voyez,
Would you like to configure an Objective-C bridging header
cliquez sur - Oui<target_name>-Bridging-Header.h
sera généré automatiquementAjouter une classe à Bridging-tête
En
<target_name>-Bridging-Header.h
ajouter une ligne#import "<MyFileName>.h"
PS Si vous devez ajouter des fichiers Objective-C existants dans le projet Swift, ajoutez
Bridging-Header.h
au préalableConsommateur Objective-C, producteur Swift
Ajouter un
<MyFileName>.swift
et étendNSObject
Importez des fichiers Swift dans la classe ObjC
Ajoutez
#import "<#YourProjectName#>-Swift.h"
dans votre fichier Objective-CMarquer le code Swift public [@objc et @objcMembers]
la source
Apple a fourni un guide officiel dans ce document: 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 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 créez et le nomme en utilisant le nom de votre module de 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
Modifiez l'en-tête de pontage pour exposer votre code Objective-C à votre code Swift:
Tous les en-têtes Objective-C publics répertoriés dans l'en-tête de pontage sont visibles par Swift.
la source
Approche bidirectionnelle pour utiliser l'objectif-c objectif-c
1
2
Maintenant prêt à partir Merci
la source