Подтвердить что ты не робот

Класс 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?

4b9b3361

Ответ 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