Xcode MyProjectName-Bridging-Header.h не существует

118

Я хочу начать использовать Swift в своем проекте Objective-C. Итак, я добавил быстрый класс:

import Foundation
@objc class System : NSObject {
    @objc func printSome() {
        println("Print line System");
    }
}

И импортировал его в файл .m:

#import "MyProjectName-Swift.h"

При создании своего проекта я получаю следующую ошибку:

Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist

ПРИМЕЧАНИЕ. В разделе «Параметры сборки-> Компилятор Swift - Генерация кода-> Заголовок объединения Objective-C» установлено значение MyProjectName-Bridging-Header.h

Что мне делать, чтобы решить эту проблему?

Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: файл заголовка моста: #if defined (__ has_include) && __has_include () # include #endif

#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"

#if defined(__has_feature) && __has_feature(modules)
#endif

#pragma clang diagnostic pop
user2408952
источник
2
MyProjectName-Swift.hи MyProjectName-Bridging-Header.hработаем в противоположных направлениях. MyProjectName-Swift.hпредоставляется автоматически. MyProjectName-Bridging-Header.hоднако предоставляется полуавтоматически, т.е. вы должны убедиться, что он есть. Итак, вы уверены, что видите MyProjectName-Bridging-Header.hв навигаторе проекта? Если нет, создайте и добавьте файл с этим именем в свой проект. Затем еще раз проверьте , что путь к нему в параметрах сборки правильно (она должна включать в свой каталог проекта: MyProjectName/MyProjectName-Bridging-Header.h.
Милош
Вы проверили, что название модуля вашего продукта не пустое? (Настройки сборки -> Упаковка -> Название модуля продукта)
Нина
Нина, да, мой модуль называется «MyProjectName» и ничего не говорит об этом
user2408952
milos, я думал, что Xcode должен был автоматически сгенерировать этот файл briding. Так что нет у меня этого файла в моем проекте.
user2408952
1
Вы вручную указали Bridging-Header.h? Я вижу, есть орфографическая ошибка «Брайдинг»
Нина

Ответы:

191

Если файл моста создается на том же уровне, что и другие классы, вам может потребоваться добавить относительный путь, как показано на этих рисунках. Обратите внимание, что файл моста создается на том же уровне, что и другие классы: введите описание изображения здесь

Я правильно ввел имя в настройках сборки, введите описание изображения здесь

но компилятор не находит файл. введите описание изображения здесь

Поэтому, если я добавляю относительный путь от корня проекта (то есть добавляю ./ProjectName/BridgerFileName.h), введите описание изображения здесь

теперь он компилируется, и я могу вызвать метод в моем классе Objective C: введите описание изображения здесь

Джеймс Туми
источник
4
По мне это вообще не исправить. Похоже, что XCode не реагирует на обновленное поле заголовка моста Objective-C.
Дариус Миляускас
Мне потребовалось много времени, чтобы найти, но наконец. Спасибо, ошибка исправлена ​​:)
Андерс Соренсен
Хорошо продемонстрировано! И да, не забудьте сделать это как в настройках сборки проекта, так и в настройках целевой сборки.
Акаш Бхардвадж
72

Я обнаружил, что после создания файла заголовка моста вручную и выбора имени и местоположения по умолчанию, заголовок моста будет помещен в каталог проекта, который находится в корневом каталоге.

Для этого требуется следующее значение параметра: Targets> [Your App Target]> Build Settings> Swift Compiler - Code Generation> Objective-C Bridging Header :

$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h 

Обратите внимание, что если ваш проект представляет собой быстрый модуль (фреймворк), то, как указано в комментариях, вы можете предпочесть:

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h
Дон Вон
источник
2
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.hбудет чаще :)
gaussblurinc
1
это должен быть единственный ответ!
Лука Даванцо
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.hдо папки моего проекта я получаю правильный путь, но добавление /$(PROJECT_NAME)не приводит меня к желаемому пути.
iPeter
Примечание для других, у которых может быть такая же проблема. Когда я копировал / вставлял комментарий @gaussblurinc, в части строки «Заголовок» был скопирован какой-то странный символ. После копирования / вставки той же строки из ответа он работал нормально.
Адам Джонс
46

Для тех, кто удаляет мостовой заголовок

Я шел противоположным путем, как и большинство других ответов здесь. Раньше я использовал Bridging Header, но он мне больше не нужен. После того, как я удалил его из своего проекта, я начал получать ошибку, упомянутую в вопросе. Я выполнил следующие шаги, чтобы решить свою проблему.

  1. Перейдите в Targets> [Your App Target]> Build Settings> Swift Compiler - General> Objective-C Bridging Header и удалите путь. (Спасибо @Donamite за идею.) (Вы можете просто начать вводить «мост» в поле поиска, чтобы найти его.)
  2. Удалите производную дату. Перейдите в Xcode> Preferences> Locations и щелкните серую стрелку возле папки Derived Data. Затем удалите папку с проектом.

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

Suragch
источник
22

В Swift 4.1

твой проект у тебя нет bridging-Header.h файла, но у вашего проекта есть этот путь. Для этого вам нужно удалить этот путь ...

Перейдите к targetsфайлу и выберите Build Settings----> Swift Compiler - Generalи удалите файл bridging-Header.h. Следуйте приведенным ниже снимкам экрана ....введите описание изображения здесь

Удалите bridging-Header.hфайл в Swift Compiler - Общие

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

Вот и получилось вот так ...

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

IOS
источник
14

Чтобы добавить файл моста в проект Swift.

Шаг 1. Перейдите в Файл> Добавить какао с файлом Objective-C (для временной цели)

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

Шаг 2. Затем появится следующее всплывающее окновведите описание изображения здесь

Теперь нажмите кнопку Create Bridging Header Button.

СДЕЛАНО
ВЫ ПОЛУЧИТЕ ФАЙЛ BRIGDE УПАКОВКАМИ
СПАСИБО

Маниндджит Сингх
источник
13

Это шаги для создания заголовка моста.

  1. File-> New-> iOS-> Header File , укажите имя файла моста, например "yourProjectName-Bridging-Header.h"

  2. Сборка-Настройки-> Заголовок моста Objective-C , просто укажите имя файла заголовка моста как "ProjectName-Bridging-Header.h"

    ПРИМЕЧАНИЕ. Заголовочный файл моста должен находиться в главной корневой папке проекта, где находится файл «.xcodeproj». Если нет, переместите файл заголовка Bridging в корневую папку проекта. Таким образом, Xcode сможет получить доступ к файлу моста.

  3. Соберите проект и импортируйте необходимые файлы в заголовок Bridging.

Вишнувардхен
источник
12

Для меня это помогло использовать $ (SRCROOT) / $ (PROJECT_NAME) / перед моим путем к файлу заголовка моста.

Шринивас Падидала
источник
1
Это правильный ответ. Он не должен был быть уценен. Вы можете использовать $ (SRCROOT) и $ (PROJECT_NAME) в качестве руководства, чтобы прийти к правильному ответу, но вы, вероятно, не сможете скопировать и вставить каждое решение.
Hobbes the Tige
Решение, представленное в этом ответе, на самом деле устранило мою проблему, спасибо Шринивасу Падидала
Уилсон
Сделайте это. $ (SRCROOT) / $ (PROJECT_NAME) /YourProjectName-Bridging-Header.h работает для меня ............ Вставьте $ (SRCROOT) / $ (PROJECT_NAME) / как есть ..... не добавляйте название своего проекта вместо $ (PROJECT_NAME)
ioSana
6

Для меня это помогло использовать $(SRCROOT)перед моим путем мостового заголовка Objective-C.

$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h
Antoine
источник
5

Следуйте инструкциям ниже:

  1. Удалите файл заголовка моста. , , (Может быть, вы создаете вручную) и;
  2. Создайте новый файл Swift в Objective-C Project. , , (Не импортировать, сначала создайте)

Возможно, эти две вещи помогут решить вашу проблему.

iHart
источник
5

У меня сработало следующее:

  1. Заголовочный файл моста должен находиться в главной корневой папке проекта, где находится файл «.xcodeproj». Перейдите в каталог проекта и перетащите заголовок моста в корневой каталог, если он находится внутри любой другой папки.
  2. Исправьте орфографические ошибки в названии заголовка.
  3. Очистить производные данные
  4. Цель -> Параметры сборки -> Компилятор Swift: Общие -> Добавить имя заголовка Obj C.
  5. Очистите и снова запустите.
AG
источник
2

Создание файла заголовка моста вручную

Прежде всего удалите файл заголовка Bridging, который создается Xcode. И выберите свой проект goto> Build Settings> Search the keyword. Компилятор Swift - Генерация кода. Щелкните заголовок моста Objective-C, удалите этот путь. Теперь очистите свой проект.

Теперь выберите свой проект> Окно на панели навигации. Выберите "Проекты" и удалите оттуда полученные данные.

Теперь создайте новый файл, выберите Источник, а затем выберите файл заголовка и создайте файл заголовка моста. Имя файла должно быть вашим проектом-Bridging-Header.h а затем создайте его.

Выберите свой проект goto> Настройки сборки> Поиск по ключевому слову. Компилятор Swift - Генерация кода. Щелкните заголовок моста Objective-C и теперь добавьте путь в этот заголовок моста Objective-C, например имя проекта-Bridging-Header.h

Теперь импортируйте свои классы в файл заголовка моста, и вы можете легко скомпилировать его в свой код.

Ваш файл заголовка моста выглядит так, когда вы создаете файл вручную.

Мандип Сингх
источник
0

Мне помогло переместить файл вручную по пути, указанному в сообщении об ошибке. Так:

  1. Я удалил файл (перемещен в корзину)
  2. Переместил его из корзины на путь в сообщении об ошибке
  3. Позже мне тоже пришлось чистить проект
jreft56
источник