2017-11-28 4 views
5

Ich füge Swift-Code zu einem bestehenden Objective-C-Projekt hinzu. Ich habe Probleme beim Verweisen auf eine Definition aus dem vorhandenen Präfix-Header.Referenzklassendefinition aus Präfix-Header in swift

Ich habe eine Klasse namens MyClass, definiert in Objective-C mit .h:

@interface MyClass 
+(instancetype)myClass; 
-(void)doStuff; 
@end 

Und .m:

@implementation MyClass 
+ (instancetype) myClass 
{ 
    // More to it than this, but this illustrates the setup 
    return [[MyClass alloc] init]; 
} 

- (void)doStuff 
{ 
    // Do something interesting 
} 
@end 

Das Präfix-Header MyProj-Prefix.pch enthält:

#define MYCLASS MyClass 
#define SOMEVAR @"Hello" 

Ich habe eine Überbrückungskopfzeile erstellt, die enthält:

#import "MyProj-Prefix.pch" 

Das Projekt enthält Objective-C-Code, der die Klassendefinition verwendet, z.

[[MYCLASS myClass] doStuff]; 

Ich möchte dies in meinem neuen Swift-Code widerspiegeln. I kann sehen und auf die definierte Variable verweisen, aber die definierte Klasse ist nicht sichtbar. z.B.

let someStr = SOMEVAR // This compiles 
MYCLASS.myClass.doStuff() // MYCLASS isn't visible 

Irgendwelche Hinweise, wie dies zu erreichen ist? Ich bin mir nicht einmal sicher, ob dies schnell möglich ist.

Antwort

1

Dieses Problem würde existieren, selbst wenn #define MYCLASS MyClass in einem anderen Header war, nicht unbedingt in Präfix-Header. Dies liegt daran, dass Präprozessordirektiven in Swift im Allgemeinen nicht importiert werden. Einfache Makros werden jedoch importiert, wenn sie globalen Konstanten zugeordnet werden können, was für SOMEVAR, aber nicht MYCLASS möglich ist. Siehe https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17.

Man könnte einen typealias in Swift auf globalen Bereich verwenden:

typealias MYCLASS = MyClass 

Natürlich wäre die modifizierte typealias werden muß, wenn MYCLASS im Header neu definiert wurde.

Dieser Ansatz ist leider nicht sehr hilfreich, wenn sich die Definition von MYCLASS je nachdem, wo/wie der Code erstellt wird, ändert. Da der Code jedoch einiges über das Verhalten der verschiedenen Klassen wissen muss, die als MYCLASS definiert werden können, könnte es beispielsweise möglich sein, hier Protokolle zu verwenden.

UPDATE: Nachdem ich darüber nachgedacht habe/mit ihm gespielt habe und einige andere Beiträge gelesen habe, z. Using obj-c typedef in Swift, hier ist eine bessere Lösung, denke ich. Mit dieser Methode müssen Sie Ihren Swift-Code nicht ändern, wenn in Objective-C MYCLASS d #define d ist.

Irgendwo in Ihrem Objective-C-Code, z. in dem Überbrückungs Header hinzufügen

typedef MYCLASS * _MYCLASS; 

, die dann erlauben Sie Dinge wie die folgenden in Swift zu tun:

_MYCLASS.myClass().doStuff() 

Wenn Sie darauf bestehen, wirklich auf MYCLASS in Swift aus irgendeinem Grund verwenden, das Hinzufügen typealias MYCLASS = _MYCLASS in Ihr Swift-Code wird den Trick machen.

Verwandte Themen