2016-08-02 5 views
-1

Ich kann Swift-Header in einer bestimmten Klasse in meinem Projekt nicht importieren, obwohl es für alle anderen Klassen funktioniert. Ich habe hinzugefügtMyApp-Swift.h-Datei nicht gefunden. nur für eine bestimmte Klasse

#import "MyApp-Swift.h" 

Das Interessante daran ist, dass es funktioniert, wenn ich es in der Implementierungsdatei, aber nicht in der Header-Datei importieren. Der Fehler, den ich bekomme, ist:

MyApp-Swift.h file not found. 

Warum?

+0

so Objective-C oder swift? Es ist ein großer Unterschied –

+0

Wenn Sie sich auf die Frage-Tags beziehen, sind beide enthalten, da die Frage die Integration von Swift-Code mit Objective-C ist. – aneuryzm

+0

Versuchen Sie, Bridging-Header wie folgt in Build-Einstellungen 'MyApp_Swift.h' –

Antwort

0

Siehe Abschnitt Referenzieren einer Swift-Klasse oder eines Protokolls in einem Objective-C-Header unter https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html. Es klingt wie eine Empfehlung, aber der Compiler erzwingt das meiner Erfahrung nach. Ich war normalerweise in der Lage, das Problem zu umgehen, indem ich Vorwärtsdeklarationen verwendete, wie in der oben erwähnten Apple-Veröffentlichung beschrieben, wenn ich wirklich eine Swift-Klasse in einer Kopfzeile und nicht in einer Quelldatei verwenden musste.

Hier ist ein stark vereinfachtes Beispiel. Zuerst einige Swift Code:

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

Als nächstes ist ein Objective-C-Header, der das Swift-Protokoll verwendet:

#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 

Implementierung von MyClassOC:

#import "objc.h" 

#import "cli_swift-Swift.h" 

@implementation MyClassOC 

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

@end 

Eine andere Objective-C-Klasse 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]; 
} 

Schließlich ist hier ein Brückenkopf aFunctionOC() zu Swift aussetzt:

void aFunctionOC(); 
+0

Ich sehe, tatsächlich. Mein Problem tritt auf, wenn ich eine öffentliche Eigenschaft erstellen muss (die von anderen Klassen sichtbar sein sollte), die ein schnelles Protokoll verwendet. In diesem Fall muss ich die Eigenschaft in der Kopfzeile (und das Protokoll auch) verfügbar machen. (Und ich kann Protokolle nicht deklarieren). Was schlägst du in diesem Fall vor? – aneuryzm

+0

Ich sehe kein Problem beim Deklarieren von Protokollen. Ich habe ein einfaches Beispiel hinzugefügt. Hoffentlich hilft es. Bitte lassen Sie mich wissen, wenn ich missverstanden habe, was Sie erreichen möchten. – OmniProg

+0

mhm interessant. Wenn ich das Protokoll wie Sie deklariere: "@protocol MySwiftProtocol;", erhalte ich einen Warnfehler: "Kann keine Protokolldefinition für MySwiftProtocol finden. Erhalten Sie keine solche Warnung? – aneuryzm