Impossible d'utiliser les classes Swift dans Objective-C

260

J'essaie d'intégrer du Swiftcode dans mon application, mon application est écrite Objective-Cet j'ai ajouté une Swiftclasse. J'ai fait tout ce qui est décrit ici . Mais mon problème est que Xcodeje n'ai pas créé le -Swift.hfichier, seulement les en-têtes de pontage. Je l'ai donc créé, mais il est en fait vide. Je peux utiliser toutes mes classes ObjC dans Swift, mais je ne peux pas le faire vice versa. J'ai marqué ma classe rapide avec @objcmais cela n'a pas aidé. Que puis-je faire maintenant?

EDIT: Apple dit: "Lorsque vous importez du code Swift dans Objective-C, vous comptez sur un Xcode-generatedfichier d'en-tête pour exposer ces fichiers à Objective-C. [...] Le nom de cet en-tête est le nom de votre module de produit suivi de l'ajout de" -Swift.h ”."

Maintenant, quand je veux importer ce fichier, cela donne une erreur:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

Voici mon fichier FBManager.swift:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}
dnnagy
la source
27
YourProjectName-Swift.hdevrait être un fichier d'en-tête magique que Xcode crée automatiquement pour vous pendant la compilation (vous ne le verrez pas réellement dans le navigateur du projet). Essayez de supprimer celui que vous avez créé et ajoutez-le #import YourProjectName-Swift.haux fichiers dans lesquels vous souhaitez utiliser les classes Swift.
Greg
3
Votre application que vous créez s'appelle- myProjectModulet-elle? Le -Swift.hfichier doit commencer par le nom de votre application. Avez-vous un fichier se terminant par -Bridging-Header.h? Vous devriez. Si c'est le cas, la première partie de ce fichier est le nom de votre projet. Combinez la première partie de ce nom de fichier avec -Swift.het c'est ce que vous devriez inclure.
vacawama
4
J'ai ce travail avec succès dans mon projet, et pourtant il n'y a aucun fichier se terminant -Swift.hsur mon Mac, et pourtant je peux l'inclure. Alors ne vous attardez pas à chercher un tel fichier. Assurez-vous simplement de le nommer correctement.
vacawama
2
@vacawama Notez que vous pouvez voir le contenu après avoir ajouté l'instruction d'importation à un fichier Objective-C en commandant-cliquant sur l'importation comme si vous visitiez un autre fichier d'en-tête.
Kendall Helmstetter Gelner
4
Je devais utiliser#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Réponses:

516

J'ai passé environ 4 heures à essayer d'activer Swiftdans mon Xcodeprojet basé sur Objective-C. Mon myproject-Swift.hfichier a été créé avec succès, mais mon Xcoden'a pas été vu Swift-classes. J'ai donc décidé de créer un nouveau Xcodeprojet basé sur Objc et finalement, j'ai trouvé la bonne réponse! J'espère que ce message aidera quelqu'un :-)

Intégration Swift étape par étape pour un projet basé sur Xcode Objc:

  1. Créez un nouveau *.swiftfichier (dans Xcode) ou ajoutez-le à l'aide du Finder.
  2. Créez un Objective-C bridging headerquand Xcode vous le demande.
  3. Implémentez votre classe Swift:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Ouvrez les paramètres de construction et vérifiez ces paramètres:

    • Définit le module: YES

      Copiez et collez le nom du paramètre dans une barre de recherche

    • Nom du module de produit: myproject

      Assurez-vous que le nom de votre module de produit ne contient aucun caractère spécial

    • Installez l'en-tête de compatibilité Objective-C: YES

      Une fois que vous avez ajouté un *.swiftfichier au projet, cette propriété apparaîtra dans les paramètres de construction

    • En-tête d'interface généré par Objective-C: myproject-Swift.h

      Cet en-tête est généré automatiquement par Xcode

    • En-tête de pontage Objectif-C: $(SRCROOT)/myproject-Bridging-Header.h
  5. Importez l'en-tête de l'interface Swift dans votre fichier * .m.

    #import "myproject-Swift.h"

    Ne faites pas attention aux erreurs et aux avertissements.

  6. Nettoyez et reconstruisez votre projet Xcode.
  7. Profit!
sig
la source
2
Quelqu'un a-t-il vu la configuration requise (au moins pour moi) dans la documentation à: developer.apple.com/library/prerelease/ios/documentation/Swift/… à l'étape 4 ci-dessus? Si c'est le cas, je l'ai raté. Merci @sig.
Morkrom
2
Mon problème était beaucoup plus simple - je n'ai pas pu trouver le fichier "myproject-Swift.h", il me semble donc que cela ne fonctionne pas. Apparemment, ce fichier n'est pas visible dans le navigateur de projet.
Asaf
6
@Asaf En fait, oui, ce fichier est généré automatiquement par Xcode et localisé dans le chemin de génération de votre projet. Ainsi, vous pouvez trouver ce fichier manuellement dans le Finder / Console ou l'ouvrir directement dans Xcode en utilisant Cmd + LeftClick #import "myproject-Swift.h".
sig
1
Quant à moi, le n ° 5 était suffisant pour résoudre le problème !!
skywinder
12
Avec vos 4 heures, vous avez économisé des centaines de nos heures, merci beaucoup :) Enregistré dans mon favori;)
Abo3atef
65

Ne créez pas le fichier d'en-tête vous-même. Supprimez celui que vous avez créé.

Assurez-vous que vos classes Swift sont étiquetées @objcou héritent d'une classe qui dérive (directement ou indirectement) de NSObject.

Xcode ne générera pas le fichier si vous avez des erreurs de compilation dans votre projet - assurez-vous que votre projet se construit correctement.

Facture
la source
8
être constructible était la clé pour moi. Impossible de construire car il n'a pas pu trouver mon fichier -swift.h, mais il n'a pas pu trouver mon fichier -swift.h car il n'a pas pu construire: /
anders
13
@anders tout en étant piégé dans ce cycle, vous pouvez utiliser find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -upour voir si le fichier a été créé avec un nom inattendu comme pour moi. :)
CodeReaper
38

Autorisez Xcode à faire son travail, n'ajoutez / créez pas l'en-tête Swift manuellement. Ajoutez simplement @objc avant votre classe Swift ex.

@objc class YourSwiftClassName: UIViewController

Dans la configuration de votre projet, recherchez les drapeaux ci-dessous et changez-le en OUI (projet et cible)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Ensuite, nettoyez le projet et générez une fois, après la réussite de la génération (il devrait probablement) importer le fichier d'en-tête ci-dessous dans votre fichier .m de classe c-objective

#import "YourProjectName-Swift.h" 

Boooom!

Bharat Modi
la source
1
Merci, cela a été incroyablement simple et a résolu mon problème.
Felipe
Je ne vois aucune de ces options dans les paramètres de construction (Xcode 7.3.1). Que devrais-je faire?
iosdude
1
^ J'ai dû passer de Basicà Alldans la barre supérieure.
iosdude
1
Embedded Content Contains Swifta été remplacé par Always Embed Swift Standard Librariesavec Xcode 8: stackoverflow.com/questions/38792650/…
William Grand
@WilliamGrand Merci pour la suggestion, mis à jour la réponse.
Bharat Modi
28

Également probablement utile pour ceux d'entre vous qui ont un objectif Framework :

L' instruction d'importation du fichier d'en-tête généré automatiquement est un peu différente des cibles d'application. En plus des autres choses mentionnées dans d'autres réponses, utilisez

#import <ProductName/ProductModuleName-Swift.h>

au lieu de

#import "ProductModuleName-Swift.h"

selon la documentation d'Apple sur Mix & Match pour les cibles du framework.

Jeehut
la source
1
@dinesharjani Heureux d'avoir pu aider! :)
Jeehut
Qu'en est-il des cibles groupées?
Iulian Onofrei
14

Assurez-vous que votre projet définit un module et que vous avez donné un nom au module. Reconstruisez ensuite, et Xcode créera le -Swift.hfichier d'en-tête et vous pourrez l'importer.

Vous pouvez définir la définition et le nom du module dans les paramètres de votre projet.

Leo Natan
la source
14

Détails: Projet Objective-C avec code Swift 3 dans Xcode 8.1

Tâches:

  1. Utiliser l'énumération rapide dans la classe objective-c
  2. Utiliser l'énumération objective-c dans la classe rapide

ÉCHANTILLON COMPLET

1. Classe Objective-C qui utilise l'énumération Swift

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Détecter le code Swift dans le code Objective-C

Dans mon exemple, j'utilise SwiftCode.h pour détecter le code Swift dans Objective-C. Ce fichier est généré automatiquement (je n'ai pas créé de copie physique de ce fichier d'en-tête dans un projet), et vous ne pouvez définir que le nom de ce fichier:

entrez la description de l'image ici

entrez la description de l'image ici

Si le compilateur ne trouve pas votre code Swift de fichier d'en-tête, essayez de compiler le projet.

2. Classe Swift qui utilise l'énumération Objective-C

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Détecter le code Objective-C dans le code Swift

Vous devez créer un fichier d'en-tête de pontage. Lorsque vous ajoutez un fichier Swift dans le projet Objective-C ou un fichier Objective-C dans le projet Swift, Xcode vous proposera de créer un en-tête de pontage.

entrez la description de l'image ici

Vous pouvez modifier le nom du fichier d'en-tête de pontage ici:

entrez la description de l'image ici

Bridging-Header.h

#import "ObjcClass.h"

Usage

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

Résultat

entrez la description de l'image ici


PLUS D'ÉCHANTILLONS

Étapes d'intégration complète Objective-c et Swift décrites ci-dessus . Maintenant, je vais écrire quelques autres exemples de code.

3. Appelez la classe Swift à partir du code Objective-c

Classe Swift

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Code Objective-C (code appelant)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

Résultat

entrez la description de l'image ici

4. Appelez la classe Objective-c à partir du code Swift

Classe Objective-C (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Code Swift (code d'appel)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

Résultat

entrez la description de l'image ici

5. Utilisez l'extension Swift dans le code Objective-c

Extension rapide

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Code Objective-C (code appelant)

[UIView swiftExtensionFunc];

6. Utilisez l'extension Objective-c dans le code rapide

Extension Objective-C (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Code Swift (code d'appel)

UIView.objcExtensionFunc()
Vasily Bodnarchuk
la source
Ces échantillons sont vraiment utiles, merci! Et comme pour Swift 4+, nous devons ajouter @objcMembersdevant la classe. Parce que l' @objcinférence a été réduite dans Swift 4 à des fins d'optimisation. Par exemple, une propriété dans une classe dérivée de NSObject ne déduira plus @objc par défaut (comme dans Swift 3). J'ai obtenu cette information de cette réponse .
Hustlion
11

J'ai eu le même problème et il s'est avéré que les symboles spéciaux dans le nom du module sont remplacés par xcode (dans mon cas, les tirets ont fini par être des traits de soulignement). Dans les paramètres du projet, cochez "nom du module" pour trouver le nom du module pour votre projet. Après cela, utilisez ModuleName-Swift.hou renommez le module dans les paramètres.

Max Mikheyenko
la source
10
Je suis un crétin. J'ajoutais le nom de la classe, puis j'ajoutais "-Swift". Il s'avère que c'est le nom du "module". +1 pour m'avoir fait réaliser cela.
HotFudgeSunday
2
Un autre crétin ici qui pensait que c'était le nom de la classe!
Charlie Martin du
9

Le fichier est créé automatiquement (en parlant de Xcode 6.3.2 ici). Mais vous ne le verrez pas, car il se trouve dans votre dossier de données dérivées. Après avoir marqué votre classe rapide avec @objc, compilez, puis recherchez Swift.hdans votre dossier de données dérivées. Vous devriez y trouver l'en-tête Swift.

J'ai eu le problème, que Xcode renommé mon my-Project-Swift.hà my_Project-Swift.hXcode ne fonctionne pas comme "." "-"symboles etc.. Avec la méthode ci-dessus, vous pouvez trouver le nom de fichier et l'importer dans une classe Objective-C.

brainray
la source
1
Cela a également résolu mon problème. Dans mon fichier .m, j'importe le fichier comme ceci #import "my_project-Swift.h" et mon nom de projet réel estmy-project
Bhavin_m
Attention, pas seulement "." "-" espace également :(
user1105951
8

Il suffit d'inclure #import "myProject-Swift.h" dans le fichier .m ou .h

PS Vous ne trouverez pas "myProject-Swift.h" dans l'inspecteur de fichiers, il est caché. Mais il est généré automatiquement par l'application.

Svitlana
la source
Merci pour les avertissements, mon pote.
Felipe
Cette réponse m'a aidé et m'a sauvé la journée. L'important est que Xcode le génère automatiquement et que c'est un fichier HIDDEN. Je créais moi-même "myProject-Swift.h" et cela ne fonctionnait pas.
C0mrade
5

La réponse @sig est l'une des meilleures, cependant, cela ne fonctionnait pas pour moi avec l'ancien projet (pas nouveau!), j'avais besoin de quelques modifications. Après beaucoup de variations, j'ai trouvé la recette pour moi (en utilisant XCode 7.2):

  1. Nom du module de produit: $ (PRODUCT_NAME: c99extidentifier)
  2. Définit le module: NON
  3. Le contenu intégré contient Swift: NON
  4. Installer l'en-tête de compatibilité Objective-C: OUI
  5. En-tête de pontage Objective-C: ProjectName-Bridging-Header.h

Le dernier point (5) était crucial. Je ne l'ai mis que dans la deuxième section (champ Targets), le champ Project doit être laissé vide: entrez la description de l'image icisinon, il n'a pas généré le bon fichier "Project-Swift.h" pour moi (il n'incluait pas les méthodes swift).

Darius Miliauskas
la source
1
également un lien utile: ericasadun.com/2014/08/21/…
Darius Miliauskas
1
Merci Merci Merci beaucoup @DariusMiliauskas ne l'a fait fonctionner qu'avec votre lien
a4arpan
1
@DariusMiliauskasthanks beaucoup! le point 5 a également résolu le problème pour moi dans l'ancien projet Xcode
tatiana_c
Define Modulesdevrait être No??
Sunil Chauhan
@SunilChauhan, Oui, il n'est utilisé que pour les framewoks .
Iulian Onofrei
5

Il y a deux conditions,

  • Utilisez votre fichier rapide dans le fichier objectif c.
  • Utilisez votre fichier objectif c dans un fichier rapide.

Donc, à cette fin, vous devez suivre ces étapes:

  • Ajoutez votre fichier swift dans un projet objective-c ou vice-versa.
  • Créez un fichier d'en-tête (.h).
  • Accédez aux paramètres de construction et effectuez les étapes ci-dessous avec la recherche,

    1. recherchez ce texte "brid" et définissez un chemin d'accès à votre fichier d'en-tête.
    2. "Définit le module": OUI.
    3. "Toujours intégrer des bibliothèques standard Swift": OUI.
    4. "Installer l'en-tête de compatibilité Objective-C": OUI.

Après cela, nettoyez et reconstruisez votre projet.

Utilisez votre fichier rapide dans le fichier objectif c.

Dans ce cas, écrivez d'abord "@objc" avant votre classe dans un fichier swift.

Après cela, dans votre fichier objectif c, écrivez ceci,

  #import "YourProjectName-Swift.h"

Utilisez votre fichier objectif c dans un fichier rapide.

Dans ce cas, dans votre fichier d'en-tête, écrivez ceci,

  #import "YourObjective-c_FileName.h"

J'espère que cela t'aidera.

vikas prajapati
la source
4

Pour Swift 5:

  1. Ajoutez le @objcmot - clé à votre classe et à vos méthodes
  2. Ajouter un publicmot-clé à votre classe et à vos méthodes
  3. Laissez votre classe hériter de NSObject
  4. Projet de construction
  5. Mettez #import "MyProject-Swift.h"dans votre fichier Objective-C

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
Nico S.
la source
"Ajoutez le mot clé @objc à votre classe et à vos méthodes" - idem pour Swift 4
Krzysztof Skrzynecki
3

Dans mon cas, en dehors de ces étapes:

  1. Nom du module de produit: myproject
  2. Définit le module: OUI
  3. Le contenu intégré contient Swift: OUI
  4. Installer l'en-tête de compatibilité Objective-C: OUI
  5. En-tête de pontage Objective-C: $ (SRCROOT) /Sources/SwiftBridging.h

J'ai dû mettre la classe en public afin de créer le fichier productName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }
93sauu
la source
2

Je viens de découvrir que l'ajout d'un répertoire de fichiers rapides à un projet ne fonctionnera pas. Vous devez d'abord créer un groupe pour le répertoire, puis ajouter les fichiers rapides ...

Darren Ehlers
la source
@ <classe spécifique>; doit être défini, puis le projet utilisateur verra ces fichiers.
Nikita
2

J'ai eu le même problème et finalement il est apparu qu'ils n'étaient pas attachés aux mêmes cibles. La classe ObjC est attachée à Target1 et Target2, la classe Swift n'est attachée qu'à Target1 et n'est pas visible à l'intérieur de la classe ObjC.

J'espère que cela aide quelqu'un.

Dani.Rangelov
la source
J'ai complètement ignoré cela avec différents objectifs de mise en scène et de production. Merci pour votre réponse!
Benjamin Martin
Que signifie «attaché»?
Iulian Onofrei
"attaché" = "membres", ils doivent être répertoriés comme membres cibles
Dani.Rangelov
1

mon problème était que je suis resté coincé après que xcode ait créé le fichier bridge mais j'ai quand même eu une erreur dans le nom du fichier d'en-tête MYPROJECTNAME-swift.h

1.Je vérifie dans le terminal et recherche tous les fichiers de pont rapide créés automatiquement:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

vous voyez ce que xcode a créé.

  1. dans mon cas, j'avais de l'espace dans le nom de mon projet et xcode remplacer c'est '_'
user1105951
la source
1

Lorsque vous ajoutez de nouveaux fichiers Swift au projet, assurez-vous de les ajouter aux cibles correctes. Veuillez vous assurer que chaque fichier Swift que vous allez utiliser hérite de la classe NSObject et annoté avec @ObjCMembers Changez en YES dans les paramètres de construction sous l'option ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Passez à OUI dans les paramètres de construction sous l'option DEFINES_MODULE.

Boris
la source
0

J'ai la même erreur: myProjectModule-Swift.hfichier introuvable ", mais, dans mon cas, la vraie raison était dans une cible de déploiement incorrecte:" Swiftn'est pas disponible sur OS X avant 10.9; veuillez définir MACOSX_DEPLOYMENT_TARGETà 10,9 ou plus tard (actuellement, il est '10,7 ') "donc, quand j'ai changé la cible de déploiement en 10,9 - le projet a été compilé avec succès.

slavik
la source
0

Mon problème était que la génération automatique du fichier -swift.h n'était pas en mesure de comprendre une sous-classe de CustomDebugStringConvertible. J'ai plutôt changé de classe pour devenir une sous-classe de NSObject. Après cela, le fichier -swift.h incluait désormais correctement la classe.

Justin Domnitz
la source
0

J'ai eu des problèmes en ce que j'ajouterais des classes à mon en-tête de pontage d'objectif-c, et dans les en-têtes d'objectif-c qui ont été importés, ils essayaient d'importer l'en-tête rapide. Ça n'aimait pas ça.

Donc, dans toutes mes classes objective-c qui utilisent swift, mais sont également pontées, la clé était de vous assurer que vous utilisez des déclarations de classe avancées dans les en-têtes, puis importez le fichier "* -Swift.h" dans le fichier .m.

fer à cheval7
la source
0

Je n'ai pas eu à modifier les paramètres de la build ni à ajouter @obj à la classe.

Tout ce que j'avais à faire était de créer un en-tête de pont qui était automatiquement créé lorsque je créais des classes Swift dans le projet Objective-c. Et puis je devais juste faire

importer "Bedtime-Swift.h" <- à l'intérieur du fichier objective-c qui devait utiliser ce fichier swift.

coolcool1994
la source
0

eh bien, après avoir lu tous les commentaires et essayé et lu et réessayé, j'ai réussi à inclure des cours rapides dans mon projet Big obj-c. Alors, merci pour toute l'aide. Je voulais partager un conseil qui m'a aidé à mieux comprendre le processus. Dans la classe .m, est allé à la ligne d'importation du nom cible rapide #import "myTargetName-Swift.h" et a cliqué sur la clé:

commande + clic de souris -> Aller à la définition entrez la description de l'image ici

Là, vous pouvez voir toute la traduction de swift en obj-c et vous trouverez les différentes fonctions re-déclarées dans obj-c. J'espère que cette astuce vous aidera autant qu'elle m'a aidé.

Techno Mag
la source
0

Utilisation de classes Swift dans Objective-C

Si vous allez importer du code dans une cible d'application (mélanger Objective-C et Swift dans un projet), vous devez utiliser la ligne d'importation suivante #import "<#YourProjectName#>-Swift.h"pour exposer le code Swift au code Objective-C [Mélanger le code Swift et Objective-C dans un projet]

Dans cet article, je décrirai comment importer une bibliothèque statique Swift dans du code Objective-C

Consommateur Objective-C -> Bibliothèque statique Swift

Xcode version 10.2.1

Créer une bibliothèque statique Swift

Suivre Create Swift static library avec les prochains ajouts:

Exposez l'API Swift. Pour utiliser les fonctions de Swift depuis Objective-C [À propos]

Après la construction, vous devriez trouver un <product_name>-Swift.hfichier qui devrait se trouver dans DerivedSources [Fichier introuvable]

Consommateur Objective-C avec bibliothèque statique Swift

Drag and drople binaire dans le projet Xcode [À propos]

Link Library[Symboles non définis] [Lien vs intégration]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Ajouter Library Search paths[Bibliothèque introuvable pour] [Chemin récursif]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Ajouter Header Search Paths[Module introuvable] [Chemin récursif]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Ajoutez vide .swift fileau projet Objective-C. [Symboles non définis] Lorsque Xcode demande, appuyez sur Créer Bridging Header(il créera module_name-Bridging-Header.h) et configurez un chemin d'accès à ce fichier dans

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Importer le module dans le code client Objective-C [Fichier introuvable] [nom_module]

#import "module_name-Swift.h"

Plus d'exemples ici

yoAlex5
la source
0

XCode 11.3.1:

Lorsque je veux utiliser une classe interne Swift dans un code objc, il ne compile pas pour l'erreur "symbole non défini" (pour la classe interne et la classe externe), j'ai vérifié l'en-tête "-swift.h" généré et les deux classes sont Là.

Après avoir essayé pendant des heures, je convertis la classe interne en classe normale et elle se compile.

Je nettoie le projet, supprime le dossier DerivedData et il compile.

Bill Chan
la source
1
Avez-vous essayé d'ajouter @objcavant la déclaration de la classe interne?
dnnagy
merci @dnnagy, vérifié qu'il ne s'agit pas d'un problème de syntaxe.
Bill Chan
-1

Après avoir fait tout ce qui précède, j'ai encore des erreurs. Mon problème a fini par être que les fichiers Swift dont j'avais besoin n'étaient pas ajoutés aux ressources du bundle pour une raison quelconque.

J'ai corrigé cela en allant dans [MyTarget]> Build Phases> Copy Bundle Resources, puis j'ai cliqué sur le bouton plus et ajouté les fichiers Swift.

onemoreanimal
la source
Les ressources du bundle de copie ne doivent pas inclure de code source
Bill Chan