Swift framework - заголовок Objective-C не найден - PullRequest
0 голосов
/ 08 октября 2018

Я создал небольшой тестовый фреймворк в Swift.Моя цель - использовать класс Swift в классе Objective-C.Я создал Swift файл.А затем файл Objective-C.Я убедился, что заголовок Objective-C в Параметры сборки равен Test-Swift.h
Когда я пытаюсь импортировать Test-Swift.h в файл target-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):

enter image description here

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

1 Ответ

0 голосов
/ 09 октября 2018

Синтаксис для импорта кода 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")
    }
}  

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

@objc func addTest()...

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

Тогда в вашем классе Objective-C вы можете сделать:

[test performSelector:@selector(addTest)];

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

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

...