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

У меня есть новый проект Swift с несколькими файлами, мне нужно было добавить немного кода Objc.

В Build Settingsмой Objective-C Generated Interface Header Name является MyProject-Swift.h

Product Module Name а также Product Name оба MyProject.


мой Objective-C Bridging Header является MyProject/MyProject-Bridging-Header.h

Содержание моего Bridging Header являются:

#ifndef MyProject_Bridging_Header_h
#define MyProject_Bridging_Header_h

#import "Blakey.h"

#endif

Blakey.h довольно просто:

@import Foundation;

#import "MyProject-Swift.h"
@class KeyPair;

@interface Blakey: NSObject

- (void)createKeyPairForSeed:(NSString *)seed;

@end

А также Blakey.m

#import <Foundation/Foundation.h>
#import "Blakey.h"

@implementation Blakey


- (void)createKeyPairForSeed:(NSString *)seed;
{

}

@end

(примечание: я знаю, что моя функция возвращает пустоту, которая будет изменена позже, когда эта проблема будет исправлена, поэтому она возвращает фактическое значение)

Почему XCode выдает ошибку в #import "MyProject-Swift.h" в Blakey.h?

6 ответов

Решение

Project-Swift.h это файл, автоматически сгенерированный Xcode при успешной компиляции проекта. Поймайте здесь слово успешной компиляции, если ваш проект имеет какую-либо ошибку компиляции Project-Swift.h файл не будет сгенерирован. Таким образом, это становится тупиком. Bestway закомментирует все строки, которые имеют ошибку компиляции, а затем удается ее компилировать без каких-либо ошибок. Только после этого Project-Swift.h будет сгенерировано.

Дополнительная информация, как только Project-Swift.h файл генерируется, если вы открываете его и видите, что ваш swift-класс там не импортирован. Project-Swift.h импортирует только те классы, которые выходят из NSObject. Поэтому обычные классы Swift не будут импортированы.

ВОПРОС:

Вам нужно импортировать Project-Swift.h в.m файле, а не.h файле. Так что измени свой Блейк как

#import <Foundation/Foundation.h>
#import "Blakey.h"
#import "MyProject-Swift.h"

@implementation Blakey


- (void)createKeyPairForSeed:(NSString *)seed;
{

}

Наконец удалить #import "MyProject-Swift.h" от Blakey.h

@import Foundation;

@class KeyPair;

@interface Blakey: NSObject

- (void)createKeyPairForSeed:(NSString *)seed;

@end

У меня была похожая проблема, и я чуть не потратил целый день, пытаясь выяснить, что не так с моим приложением. Итак, следуя решению, которое мне помогло:

  1. Очистить производные данные
  2. Создайте класс в swift с префиксом @objc, например, @objc class mySwiftClass {...}
  3. Снова постройте проект

Эт вуаля.. Должно работать сейчас.

Зачем добавлять @objc? Этот префикс @objc указывает компилятору генерировать для вашего класса swift заголовочный файл. он добавит его в файл "MyModule-Swift.h"

Я понимаю, что это старая тема, но у меня были похожие проблемы после добавления новой цели в проект. Я решил это, добавив макрос препроцессора (Настройки сборки -> Apple Clang - Предварительная обработка) только в указанной цели, а затем импортировав Swift.hфайл условно, вот так:

      #if DEV_VERSION
#import "Project_DEV-Swift.h"
#else
#import "Project-Swift.h"
#endif

Моя главная цель называется Projectи новая цель Project DEV(пробел заменен на подчеркивание в импорте), и вызывается макрос препроцессора DEV_VERSION.

После этого обе цели строятся просто отлично.

Вы можете работать с типами, объявленными в Swift, из кода Objective-C вашего проекта, импортировав Xcode-generated header file,

Название заголовка генерируется из имени модуля вашего продукта, за которым следует "-Swift.h" (<product_name>-Swift.h). По умолчанию это имя совпадает с именем вашего продукта, а любые не буквенно-цифровые символы заменяются подчеркиванием (_). Если имя начинается с цифры, первая цифра заменяется подчеркиванием.

Objc header file который содержит все определения классов Swift, помеченные [@objc и @objcMembers], также создается во время сборки, чтобы другой класс Objc мог использовать класс Swift.

Источник здесь

Вы можете работать с типами, объявленными в Swift, из кода Objective-C в своем проекте, импортировав Xcode-generated header file.

Название заголовка формируется из названия модуля продукта + -Swift.h (<product_name>-Swift.h).

Этот файл содержит Swift API для Objective-C, помеченный [@objc и @objcMembers]. В результате Objective-C может использовать Swift

У меня была аналогичная проблема, из-за которой эта проблема была бы для чего угодно, кроме live. Я решил проблему, жестко закодировав «Имя модуля продукта» и «Имя продукта» в название моего проекта. Это позволяет избежать необходимости наличия логики препроцессора в каждом файле, содержащем быстрый код, как показано в решении Паули Кеттунена.

Другие вопросы по тегам