2014-06-23 7 views
13

Ich habe ein schnelles Protokoll IModelIdProvider in der MyProjectName Ordner. Ich habe eine Ziel-C-Unit Test-Klasse namens RemoteModelFactoryTest in der MyProjectNameTests Ordner erstellt. Um einige Tests durchzuführen, muss RemoteModelFactoryTest das Protokoll IModelIdProvider implementieren.Ziel-C-Test-Klasse mit Swift-Code

Wenn ich #import "MyProjectName-Swift.h" mein schnelles Protokoll in meiner Ziel-C-Klasse verwenden, bekomme ich eine file not found.

Wenn ich die #import Anweisung #import "MyProjectNameTests-Swift.h" ändern, wird der Header gefunden wird, aber nicht mein Protokoll (es im MyProjectName Projekt definiert ist, nicht in der MyProjectNameTests Projekt).

Gibt es etwas Besonderes in den *Tests Projekten Swift-Code zu verwenden?

+2

Ist die Swift-Datei auf das Testpaket ausgerichtet? –

+0

Die aktuelle swift-Dokumentation ist entweder falsch oder es liegt ein Fehler in Xcode vor. Damit die Datei gefunden werden kann, müssen Sie "Product Module Name" in den Build-Einstellungen definieren - setzen Sie sie auf "MyProjectName" und Ihr Import sollte funktionieren. –

+0

@AbhiBeckert Ich habe versucht, den Produkt-Modul-Namen zu ändern, wie Sie vorschlagen (siehe [hier] (http://stackoverflow.com/questions/28114772/cant-use-swift-classes-inside-objective-c-unit-test)) aber das hat bisher nicht geholfen. Hast du das Rezept tatsächlich probiert? – Drux

Antwort

1

Ich weiß, seine extra Hacky und alles, aber was ich getan habe und es funktionierte, war zu kopieren Sie die öffentlichen Header von generierten "Project-Swift.h" und einfügen, was benötigt wird, um .m Datei des Tests. So

Ich kopierte etwas wie folgt aus:

SWIFT_CLASS("_TtC10Inventorum11ImageEntity") 
@interface ImageEntity : NSObject <FICEntity> 
@property (nonatomic, copy) NSString * imageID; 
@property (nonatomic) NSURL * retinaImageURL; 
@property (nonatomic) NSURL * nonRetinaimageURL; 
@property (nonatomic, readonly) NSURL * imageURL; 
@property (nonatomic, readonly, copy) NSString * UUID; 
@property (nonatomic, readonly, copy) NSString * sourceImageUUID; 
@property (nonatomic) RACSignal * rac_signalForImage; 
- (instancetype)init OBJC_DESIGNATED_INITIALIZER; 
- (NSURL *)sourceImageURLWithFormatName:(NSString *)formatName; 
- (FICEntityImageDrawingBlock)drawingBlockForImage:(UIImage *)image withFormatName:(NSString *)formatName; 
- (void)objc_setType:(NSString *)type; 
@end 

Und oben auf der ich auch alle Makros für SWIFT_CLASS kopiert haben etc. Meine Tests bauen und vorbei Swift Code zu testen.

BTW. Vergessen Sie nicht, public auf getestete Klassen und Methoden in Swift zu setzen.

-1

Um eine Reihe von Objective-C-Dateien in dasselbe Framework-Ziel wie Ihren Swift-Code zu importieren, müssen Sie diese Dateien in den Objective-C-Header für das Framework importieren.

Swift-Code in Objective-C aus dem gleichen Rahmen

Unter Build-Einstellungen zu importieren, in Verpackung, stellen Sie sicher, dass das Defines Modul für diese Rahmens Zieleinstellung auf Ja gesetzt ist. Import der Swift-Code aus diesem Rahmen Ziel in jede Objective-C .m-Datei innerhalb dieses Rahmens Ziel dieser Syntax verwendet und ersetzen die entsprechenden Namen ...

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

+2

Ich denke nicht, dass dies das Problem lösen wird, das @Morniak hat. Er sagte, dass er eine Swift-Datei von "Project-Target" in einen Obj-C Unit-Test in "ProjectTest-Target" verwenden möchte. –