Файл 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
У меня была похожая проблема, и я чуть не потратил целый день, пытаясь выяснить, что не так с моим приложением. Итак, следуя решению, которое мне помогло:
- Очистить производные данные
- Создайте класс в swift с префиксом @objc, например, @objc class mySwiftClass {...}
- Снова постройте проект
Эт вуаля.. Должно работать сейчас.
Зачем добавлять @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. Я решил проблему, жестко закодировав «Имя модуля продукта» и «Имя продукта» в название моего проекта. Это позволяет избежать необходимости наличия логики препроцессора в каждом файле, содержащем быстрый код, как показано в решении Паули Кеттунена.