Swift framework - заголовок Objective-C не найден

Я создал небольшой тестовый фреймворк в Swift. Моя цель - использовать класс Swift в классе Objective-C. Я создал Swift файл. А затем файл Objective-C. Я убедился, что заголовок Objective-C в Настройках сборки - это Test-Swift.h
Когда я пытаюсь импортировать Test-Swift.h в файл objective-C, я получить ошибку -

Файл Test-Swift.h не найден.

Класс Swift:

import Foundation

@objc class MyTest: NSObject {
    func addTest()  {
        print("test")
    }
}  

Класс Objective-C:

#import "YourTest.h"
#import <Test/Test-Swift.h>
#import "Test-Swift.h"       // Error in this line

@implementation YourTest

-(void)testTest {
    // This is how I want to use the swift class
    MyTest *test = [MyTest new];
    [test addTest];

}

@end  

Заголовок фреймворка:

#import <UIKit/UIKit.h>

//! Project version number for Test.
FOUNDATION_EXPORT double TestVersionNumber;

//! Project version string for Test.
FOUNDATION_EXPORT const unsigned char TestVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <Test/PublicHeader.h>  

Настройка сборки (заголовок objective-C):

введите описание изображения здесь

Я установил для Определяет модуль значение Да.


person Nitish    schedule 08.10.2018    source источник


Ответы (1)


Синтаксис для импорта кода Swift в целевую платформу:

#import <ProductName/ProductModuleName-Swift.h>

что в вашем случае, вероятно, будет

#import <Test/Test-Swift.h>

Эта строка, собственно, присутствует в вашем примере, и компилятор явно не жалуется на нее. См. https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c.

Другая проблема заключается в том, что вы не сможете использовать свой класс Swift так, как пытаетесь, учитывая объявление Swift. Согласно приведенной выше ссылке, объявления Swift должны иметь модификатор доступа public или open, чтобы быть видимыми через заголовок интерфейса -Swift.h. Вам также необходимо сделать addTest() функцию вызываемой из Objective-C, поэтому перед ней необходимо @objc. Итак, ваш код Swift должен быть изменен следующим образом:

@objc public class MyTest: NSObject {
    @objc public func addTest()  {
        print("test")
    }
}  

Основываясь на той же документации, упомянутой выше, вы можете затруднить доступ к addTest() коду Objective-C вне фреймворка, отбросив public:

@objc func addTest()...

(хотя вам все еще нужно @objc).

Затем в своем классе Objective-C вы можете:

[test performSelector:@selector(addTest)];

Однако любой код вне фреймворка может делать то же самое.

Другое наблюдение заключается в том, что строка кода, которая вызвала ошибку в вашем примере, т.е. #import "Test-Swift.h", является способом включения заголовка интерфейса в цель приложения, а не в структуру.

person Anatoli P    schedule 09.10.2018