2016-08-02 2 views
-1

Je ne peux pas importer l'en-tête rapide dans une classe spécifique de mon projet, bien que cela fonctionne pour toutes les autres classes. J'ai ajoutéFichier MyApp-Swift.h introuvable. pour une classe spécifique uniquement

#import "MyApp-Swift.h" 

La chose intéressante est que cela fonctionne si je l'importer dans le fichier de mise en œuvre, mais pas dans le fichier d'en-tête. L'erreur que je reçois est:

MyApp-Swift.h file not found. 

Pourquoi?

+0

si objectif-c ou rapide? c'est une énorme différence –

+0

Si vous faites référence aux tags de question, les deux sont inclus car la question concerne l'intégration du code swift avec l'objectif-C. – aneuryzm

+0

Essayez de nommer l'en-tête de pont comme ceci dans les paramètres de construction 'MyApp_Swift.h' –

Répondre

0

Voir la section Référencement d'une classe ou d'un protocole Swift dans un en-tête Objective-C au https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html. Cela ressemble à une simple recommandation, mais d'après mon expérience, le compilateur l'applique réellement. J'ai généralement été capable de contourner le problème en utilisant des déclarations directes, comme décrit dans la publication Apple référencée ci-dessus, si j'avais vraiment besoin d'utiliser une classe Swift dans un en-tête, pas un fichier source.

Voici un exemple très simplifié. Tout d'abord un code Swift:

import Foundation 

// A Swift protocol usable in Objective-C 
@objc protocol MySwiftProtocol 
{ 
    func mySwiftProtocolFun(); 
} 

// A Swift class conforming to the Swift protocol 
class MySwiftClass : NSObject, MySwiftProtocol 
{ 
    func mySwiftProtocolFun() { 
     print("Hello from MySwiftClass!") 
    } 
} 

// Call an Objective-C function 
aFunctionOC() 

Next est un en-tête Objective-C qui utilise le protocole Swift:

#import "Foundation/Foundation.h" 

// Forward declaration of a Swift protocol is OK here 
@protocol MySwiftProtocol; 

@interface MyClassOC : NSObject 

// Here we've got a property conforming to the Swift protocol 
@property id<MySwiftProtocol> prop1; 

-(void)callSwiftProtocol; 

@end 

Mise en œuvre de MyClassOC:

#import "objc.h" 

#import "cli_swift-Swift.h" 

@implementation MyClassOC 

-(void)callSwiftProtocol 
{ 
    [self.prop1 mySwiftProtocolFun]; 
} 

@end 

Une autre classe Objective-C en utilisant MyClassOC :

#import "objc.h" 
#import "cli_swift-Swift.h" 

// An Objective-C function that uses an Objective-C class 
// that has a property conforming to a Swift protocol 
void aFunctionOC() 
{ 
    MyClassOC * x = [[MyClassOC alloc] init]; 
    x.prop1 = [[MySwiftClass alloc] init]; 
    [x callSwiftProtocol]; 
} 

Enfin, voici un en-tête pont exposant aFunctionOC() à Swift:

void aFunctionOC(); 
+0

Je vois, en effet. Mon problème se pose lorsque j'ai besoin de créer une propriété publique (qui devrait être visible par d'autres classes), qui utilise un protocole rapide. Dans ce cas, j'ai besoin d'exposer la propriété dans l'en-tête (et le protocole aussi). (Et je ne peux pas transmettre les protocoles de déclaration). Que suggérez-vous dans ce cas? – aneuryzm

+0

Je ne vois pas de problème lors de la déclaration des protocoles. J'ai ajouté un exemple simple. J'espère que ça aide. S'il vous plaît laissez-moi savoir si j'ai mal compris ce que vous essayez d'accomplir. – OmniProg

+0

mhm intéressant. Si je transfère le protocole comme vous l'avez fait: "@protocol MySwiftProtocol;", j'obtiens une erreur d'avertissement: "Impossible de trouver la définition du protocole pour MySwiftProtocol." Ne pas obtenir un tel avertissement? – aneuryzm