web-dev-qa-db-fra.com

Appelez Swift fonction de la classe Objective C

J'ai un problème. J'ai un ancien projet Objective C et je souhaite appeler new Swift, j'ai créé le fichier "-Bridging-Header.h" et "-Swift.h"

c'était facile pour moi d'appeler la fonction de Swift à Objective C mais j'ai un problème pour inverser.

J'ai donc créé une classe simple "System.Swift"

import Foundation

@objc class System : NSObject {

@objc func printSome() {
    println("Print line System");
    }
}

maintenant, j'ai essayé de suivre la documentation ici et à l'intérieur du fichier <...> - Swift.h, j'ai écrit ceci

@class System;

@interface System : NSObject

-(void)printSome;

@end

et je l’ai importé dans ma classe Objective C. À ce stade de ma classe Objective C (actuellement UIViewController) de mon code Objective C, j’ai essayé d’appeler la méthode "printSome":

- (void)viewDidLoad
{
    [super viewDidLoad];
    System * sis = [[System alloc] init];
    [sis printSome];
    //any additional setup after loading the view from its nib.
}

maintenant, j'ai l'erreur de suivi:

Symboles non définis pour l'architecture i386: "_OBJC_CLASS _ $ _ System", référencé depuis: objc-class-ref dans "ObjectiveC_Class_That_Call_Call_Shift_Object" .o ld: symbole (s) non trouvé (s) pour l'architecture i386 -v voir l'invocation)

Quelqu'un peut m'aider?

Cordialement à tous.

68
Eloreden

Problème résolu, j'ai précédemment créé et inclus un nouveau .h fichier dans ma Objective-C classe nommée <ProductModuleName>-Swift.h mais, comme je l’ai découvert plus tard, cette étape n’est pas nécessaire car le compilateur crée le fichier invisible nécessaire.

Inclure simplement <ProductModuleName>-Swift.h dans votre classe et ça devrait marcher.

41
Eloreden

Oui merci

c'est étrange mais ça va marcher

1) Add @objc  to  Swift class

2) Add in .m 
    #import "(ProjectName)-Swift.h"

3) Call from .h
    @class SwiftClass;

4)On SwiftClass 
   click "Command" + Left Click (Apple Documantation)

5) To see "-Swift.h" -> click "Command" + Left Click

App va générer l'interface pour cette classe dans -Swift.h

Exemple: Swift_CLASS ("_ _TtC10Project17220PLHelper") @interface PLHelper

  • (void) notifyForDownloading: (NSDictionary *) userInfo;
  • (type d'instance) init OBJC_DESIGNATED_INITIALIZER; @fin
33
Svitlana

Supposons que nous avons ProjectName "MyFirstProjectOnSwift" et Swift nom de classe "mySwiftClass" et la classe objectiveC est "MyObjectiveCLass"

Les étapes suivantes sont: -

  1. Ajoutez #import "MyFirstProjectOnSwift-Swift.h" dans "MyObjectiveCLass.m"

  2. Ajouter @class mySwiftClass dans MyObjectiveCLass.h;

  3. Puis dans MyObjectiveCLass.m

    mySwiftClass * myClass = [mySwiftClass new]; {Call Like This dans n’importe quelle méthode, où que vous souhaitiez appeler Swift.}

  4. [myClass methodName];

29
Anubhav Giri

Vérifiez le fichier -Swift.h qui contient l'importation sur votre fichier .m dans Objective-C:

#import <YourProjectName-Swift.h>

Cliquez sur cette ligne et cliquez gauche - Aller à la définition.

Ce fichier doit être inclus automatiquement, pas manuellement.

10
Darius Miliauskas

Si vous ne voyez toujours pas votre classe, même après avoir importé <ProductModuleName>-Swift.h.

Assurez-vous que votre classe sous-classe une classe native (par exemple, UIViewController) ou au moins s'il s'agit simplement d'une classe utilitaire, créez-la sous-classe NSObject. Votre classe devrait maintenant montrer.

2
Bryan P