Класс Objective C с использованием кода Swift
У меня есть быстрый протокол IModelIdProvider
в папке MyProjectName
.
Я создал класс objective-c unit test с именем RemoteModelFactoryTest
в папке MyProjectNameTests
.
Чтобы выполнить некоторые тесты, RemoteModelFactoryTest
должен реализовать протокол IModelIdProvider
.
Когда я #import "MyProjectName-Swift.h"
использовать мой быстрый протокол в моем классе objective-c, я получаю file not found
.
Если я изменю инструкцию #import
на #import "MyProjectNameTests-Swift.h"
, заголовок будет найден, но не мой протокол (он определен в проекте MyProjectName
, а не в проекте MyProjectNameTests
).
Есть ли что-то особенное в проектах *Tests
для использования кода Swift?
Ответы
Ответ 1
Я знаю его лишнее хакки и все, но то, что я сделал, и это сработало, состояло в том, чтобы скопировать публичные заголовки из сгенерированного "Project-Swift.h" и вставить то, что нужно для .m файла теста.
Итак, я скопировал что-то вроде этого:
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
И кроме того, я также скопировал все макросы для SWIFT_CLASS и т.д. Мои тесты строят и проходят тестирование кода Swift.
BTW. Не забывайте ставить общедоступный на тестируемые классы и методы в Swift.
Ответ 2
Чтобы импортировать набор файлов Objective-C в тот же целевой объект инфраструктуры, что и ваш код Swift, вам нужно будет импортировать эти файлы в заголовок Objective-C зонтика для фреймворка.
Чтобы импортировать код Swift в Objective-C из той же структуры
В разделе "Параметры сборки" в разделе "Упаковка" убедитесь, что для параметра "Определить модуль" для этой целевой среды рамки установлено значение "Да".
Импортируйте код Swift из этой целевой среды в любой файл Objective-C.m в рамках этой целевой среды с использованием этого синтаксиса и подставив соответствующие имена...
https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75