Заголовок Swift для Objective-C не создан в Xcode 6

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

После добавления исходного файла Swift в проект у меня не возникает проблем с получением "Bridging Header", то есть Objective-C для Swift.

Но файл заголовка *-Swift.h который должен предоставлять классы Swift с пометкой @objc или подклассы классов ObjC, нигде не найден :-(

Я не вижу каких-либо конкретных инструкций о том, как выполнить использование моего нового подкласса, написанного на Swift, в моем основном коде приложения (который все еще является Objective-C).

Приложение, которым я являюсь ведущим разработчиком, имеет довольно большую кодовую базу (70 000 строк), поэтому о его переходе за один раз не может быть и речи.

Ответ 1

Теперь он работает.

  • Проект должен иметь имя модуля продукта, в котором не содержит пробелы.
  • Определяет, что в настройках сборки в разделе "Упаковка" должен быть установлен параметр Да.

Наконец работает. Спасибо всем за помощь: -)

Ответ 2

У меня была аналогичная проблема, и я обнаружил, что вы можете добавить

#import "ProductModuleName-Swift.h"

для obj-c.m файлов, а не файлов .h для заголовка зонтика, который будет найден

Ответ 3

Я обнаружил, что мне пришлось исправить все ошибки сборки до того, как он сгенерирует файл.

Проблема для меня заключалась в том, что это была проблема с курицей/яйцом, потому что я не видел никаких ошибок сборки, пока я фактически не прокомментировал инструкцию #import:

//#import "ProductModuleName-Swift.h"

который обнаружил кучу других ошибок в моем коде Swift.

Как только я исправил эти новые ошибки и получил исходное здание успешно, я раскомментировал #import и бинго! Заголовок был создан и импортирован правильно:)

Ответ 4

Если у вашего имени модуля проекта есть пробелы в нем, вы должны заменить пробелы символом подчеркивания.

Например, если ваше имя проекта "Мой проект", вы должны использовать:

#import "My_Project-Swift.h"

Ответ 5

Если вы похожи на меня, вы, вероятно, неправильно назвали заголовок. После того, как я немного потрепал голову, я искал файл в DerivedData и, конечно же, там. По моей настройке (я полагаю, используя стандартную папку с данными):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Найдет. Если ничего в этой папке не соответствует, то Xcode не генерирует его.

Я использую Xcode Version 6.2 (6C86e)

Ответ 6

* Важно только: *

использовать указанное целевое имя "Product Module Name", за которым следует -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

Независимо от того, установлен ли параметр "Определяет модуль" на "Да" или "Нет" или "Проект" Название модуля продукта "не установлен.

Напоминание: классы Swift должны извлекаться из NSObject или быть помечены атрибутом @objc, чтобы быть объектом ObjectiveC/Foundation || Cocoa...

Ответ 7

Я хотел добавить еще одну причину, по которой вы можете найти проблему с этим - я создавал фреймворк, который смешивал Swift и Objective-C. Я не смог импортировать классы Swift вне рамки - я проверил файл -Swift.h и был сгенерирован, но был пуст.

Проблема оказалась очень-очень простой - я не объявлял ни одного из моих классов Swift открытым! Как только я добавил ключевое слово public в классы, я смог использовать их из классов внутри и вне рамки.

Также обратите внимание, что внутри фреймворка (внутри .m файлов только как упоминается другой ответ) мне пришлось импортировать файл -Swift.h как:

#import <FrameworkName/FrameworkName-Swift.h>

Ответ 8

У меня была та же проблема. Похоже, вам нужно настроить параметры (Определяет модуль и имя модуля продукта) до, вы добавляете свой первый файл Swift.

Если вы сделаете это, файл "* -Swift.h" не будет создан для этого проекта, даже если вы добавите дополнительные файлы Swift или удалите файл Swift и создадите новый.

Ответ 9

Имя файла всегда предшествует имени Target. Он называется названием продукта, но фактически это имя цели. Поэтому, если вы хотите, чтобы он создавал новую цель, можно было ожидать ожидать that_target-Swift.h файла.

Один из способов справиться с этим -

  • Добавить препроцессор для каждой вашей цели, которая является именем самой вашей цели (без пробелов). Ex. MY_TARGET=1. Добавьте это в Настройки проекта → Настройки сборки → Макросы препроцессора для каждой из ваших целей.
  • Если вы используете файл PCH,

Добавьте эти строки в файл PCH

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

Преимущество использования файла PCH заключается в том, что вам не нужно включать заголовки везде.

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

Это должно работать нормально.

Ответ 10

Вот еще одна вариация модуляName-Swift.h не создается.

Я решил включить IOS Charts в мой проект, но не хотел смешивать источники в том же каталоге, поэтому я поместил папку Charts Project рядом с моим кодом папке проекта. Я перетащил проект Charts в свою панель Project Navigator и включил фреймворк в список целевых Embedded Binaries в общих настройках проекта и установил переключатель Встроенный контент содержит Swift Code. на вкладке Строить настройки в разделе Параметры сборки.

Мой файл projectName-Swift.h проекта никогда не будет генерировать независимо от того, какие другие переключатели или настройки предлагаются здесь. Наконец, используя метод Lou Z для поиска файлов -Swift.h, я увидел, что файл Charts-Swift.h был сгенерирован глубоко в моем каталоге xcode Build в Charts.framework/Headers/

Решение использовать ios-charts Daniel Gindi для пакета Swift без включения кода в исходный каталог проекта заключалось в том, чтобы добавить:

#import "Charts/Charts-Swift.h"

Модулям, отображающим мои данные проекта.

Ответ 11

Позвольте мне поделиться своим опытом, пытаясь использовать Swift в старом проекте objc. Мне не нужно было устанавливать Defines module в YES.

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

Отсутствует заголовок моста

Это приводит к созданию файла MyApp-Swift.h, но без каких-либо следов моих классов Swift.

В документации Apple говорится, что при добавлении первого быстрого файла вам будет предложено создать заголовок моста. Ну, я не был. Я вручную добавил файл MyApp-Bridging-header.h и указал на него в поле "Objective-C Bridging Header". Это заставило мой файл MyApp-Swift.h заполнить мои классы Swift.

Документы: Импорт Swift в Objective-C

Ответ 12

Если XCode фактически генерирует ваш заголовок -Swift.h (глубоко внутри DerivedData), но он не ссылается на ваши классы Swift, убедитесь, что у вас также определен мостовой заголовок. То, как я читал документы, подразумевало, что мне нужно только это для вызова Objective-C из Swift, но, похоже, это необходимо и для вызова Swift из Objective-C.

Смотрите мой ответ: fooobar.com/questions/29703/...

ОБНОВЛЕНИЕ: Это из-за общественных и внутренних модификаторов доступа, как я в конечном итоге нашел объяснил в документации Apple: -

По умолчанию сгенерированный заголовок содержит интерфейсы для Swift объявления, помеченные модификатором public. Он также содержит те помечается внутренним модификатором, если цель вашего приложения имеет Objective-C соединительный заголовок.

Ответ 13

Покоряйте, что много людей здесь, но добавив увлекательный скриншот. Быстрые и Obj-C-коды, безусловно, могут жить вместе. Это не все или ни одна игра.

Для доступа к файлам Swift в вашем Objective-C все, что вам нужно сделать, это добавить этот вызов в ваш файл Obj-C (в файле .m/implementation):

#import "{product_module_name}-Swift.h"

(Где {product_module_name} представляет имя модуля продукта вашего проекта). Вместо того, чтобы пытаться угадать имя вашего модуля продукта или определить угловые случаи с пробелами и специальными символами, просто перейдите на вкладку настроек сборки в проекте и введите "имя модуля продукта" - инспектор раскроет вам. Мой был тем, чего я не ожидал. Проверьте этот снимок экрана, если вы смущены.

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

И чтобы получить код Obj-c, работающий в Swift, вам просто нужно добавить заголовочный файл моста и импортировать соответствующие заголовки Obj-C.

Ответ 14

Хорошо, вот все, что вам действительно нужно!

1. Удалите все добавленные вами файлы swift и скомпилируйте код без ошибок.

----------

enter image description here

----------

2. Перейдите к настройкам сборки "Проекты" и задайте имя модуля продукта. Проект должен иметь имя модуля продукта, которое не содержит пробелов.

----------

enter image description here

----------

3.Defines Module должен быть установлен в Yes в настройках сборки, в разделе Packaging, в вашем проекте, а не в цель!

----------

enter image description here

----------

4. Теперь создайте файл swift или контроллер представления, в file-> new file->

----------

enter image description here

----------

Он попросит создать bridging-header, позволить ему сделать таковой. Если вы отклонили его один раз, вам придется вручную добавить -Bridging-Header.h

5.Добавьте @objc в контроллер, чтобы сообщить компилятору, что существует некоторый файл swift, который необходимо открыть для ObjectiveC.

----------

enter image description here

----------

6.Скомпилируйте проект и импортируйте #import "-Swift.h" в любой из контроллеров targetC, и он будет работать! Вы можете щелкнуть по нему, чтобы увидеть актуальный файл!

----------

enter image description here

----------

Надеюсь это поможет!

Ответ 15

Самое главное, что Этот файл невидим!!! По крайней мере, он находится в Xcode6 beta5. В вашем рабочем пространстве не будет такого файла с именем "YourModule-Swift.h". Просто убедитесь, что у вас есть имя модуля и определяет модуль, установленный в yes, и используйте его в своем классе Objective-C.

Ответ 16

В этом ответе рассматривается прецедент, в котором у вас может быть код Objective-C, который вызывает классы Swift, и затем вы начинаете получать эту ошибку.

Как исправить проблему

Следующие шаги в конечном итоге разрешили все проблемы для меня. Я читал выше, когда кто-то упоминал "курицу и яйцо", и именно эта концепция привела меня к этой процедуре. Этот явный процесс показывает, что нужно удалить любой код Objective-C, ссылающийся на классы Swift, до тех пор, пока не будет сгенерирован заголовок.

  • Комментируйте инструкцию #import "ProductModuleName-Swift.h" в ваш файл реализации Objective-C
  • Прокомментируйте любые ссылки в файле реализации Objective-C для Swift Classes
  • Очистка и сборка
  • Разрешить все ошибки/предупреждения
  • Удалить комментарий в операторе #import "ProductModuleName-Swift.h"
  • Очистить и построить (успешно или исправить любые оставшиеся ошибки, убедитесь, что вы не ссылаетесь на какие-либо классы Swift в Objective-C в этот момент. Если так временно прокомментировать это)
  • Убедитесь, что "ProductModuleName-Swift.h" генерируется Cmd-Clicking на имя класса оператора #import "ProductModuleName-Swift.h"
  • Удалить комментарий к коду, ссылающемуся на классы Swift в файле реализации Objective-C.
  • Очистить и построить как обычно ( "ProductModuleName-Swift.h" должно быть и ваш Objective-C код, ссылающийся на Swift Classes, может быть используется как обычно)

Nota Bene:. Ответы об изменении пробелов на подчеркивание и значение параметра "Да", как указано выше, по-прежнему применяются при выполнении этого процесса, также как и правила, указанные в Документация Apple.

Преодоление пути заголовка

В одной ошибке файл ProductModuleName-Bridging-Header.h не был найден во время процесса сборки. Этот факт породил ошибку

<unknown> : 0: ошибка: заголовок '/Users/Shared/Working/abc/abc-Bridging-Header.h' не существует

Более тщательная проверка ошибки указала, что файл никогда не будет существовать в указанном месте, потому что он фактически находился на (неправильном пути)

'/Users/Shared/Работа/ABC/ABC/ABC-Bridging-header.h. быстрый поиск настроек сборки цели/проектов, чтобы выполнить коррекцию вручную, и файл abc-Swift.h был снова сгенерирован автоматически.

build-settings

Ответ 17

Вам нужно импортировать заголовок в классах Objective-C, который:

#import "ProductModuleName-Swift.h"

Он автоматически генерируется, в ссылке говорится: "Любые файлы Swift в вашей цели будут видны в файлах Objective-C.m, содержащих этот оператор импорта".

Ответ 18

Фактический файл в проекте не создан ([ProductModuleName] -Swift.h). Cmd + Щелкните по импорту или генерирует его "на лету" (и в памяти), чтобы вы могли видеть, как выполняется ссылка, или открывает файл где-нибудь в каком-то кеше Xcode, но это не в директории проекта.

Вам нужно установить Определить модуль project prop (в целевых настройках сборки) на Да, и если ваше имя модуля имеет пробелы или тире - используйте _ во всех импортах [ProductModuleName] -Swift.h.

Вы можете импортировать его во все файлы .h и .m, где вы используете быстрые типы, или можете импортировать его в .pch.

Итак, если мой модуль (проект) назван "Test Project", я бы импортировал его так, в .pch файле моего проекта (только там):

#import "Test_Project-Swift.h"

Ответ 19

Просто голова для всех, кто использовал "." в там название проекта. Xcode заменит "." с подчеркиванием "_" для версии Swift для файла заголовка. Как ни странно, создаваемый Bridging-Header.h не заменяет периоды символами подчеркивания.

Например, проект с именем My.Project будет иметь следующие имена файлов заголовков мостов.

Bridging-Header.h(Autogenerated)

My.Project-мост-header.h

Swift.h

My_Project.h

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

Macintosh HD/Пользователи/пользователь/Library/Разработчик/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

Позаботьтесь,

Джон

Ответ 20

Проект должен иметь имя модуля, которое не включает пробелы. Для параметра "Модуль" должно быть установлено значение "Да" в настройках сборки, в разделе "Упаковка". прокомментировал оператор #import:

Если у вас возникла ошибка при импорте "ProductModuleName-Swift.h", то

//# import "ProductModuleName-Swift.h"

который обнаружил кучу других ошибок в моем коде Swift.

Как только я исправил эти новые ошибки и получил исходное здание успешно, я раскомментировал #import и bingo! Заголовок был создан и импортирован правильно:)

Ответ 21

Я нашел трюк, который всегда работает на меня.

  • Создайте #import "ProductModuleName-Swift.h" в файле appDelegate.h и в файле ProductName-Prefix.pch. Если у вас его нет в xcode 6, вы можете создать его таким образом Почему в Xcode 6 автоматически не создается ProjectName-Prefix.pch?
  • Command + shift + k, чтобы очистить ваш код, если вы получили сообщение об ошибке "ProductModuleName-Swift.h", удалите его из файла appDelegate.h.
  • Очистите свой код еще раз. Теперь все будет работать как шарм
  • Если вы снова получите сообщение об ошибке "ProductModuleName-Swift.h", теперь снова создайте файл appDelegate.h и снова очистите свой код.

Сделайте эту работу (удалите и создайте "ProductModuleName-Swift.h" из файла appDelegate.h и очистите свой код) каждый раз, когда вы получаете эту ошибку, чтобы ее отключить.

Ответ 22

Я нашел это решение

  • Создать SwiftBridge.h
  • положить #import "ProductModuleName-Swift.h"
  • Сделать этот файл .h общедоступным (важно) Выберите файл → В Показать файл Inspector (правая панель) → Сделать общедоступным

Теперь вы можете

#import "SwiftBridge.h"

вместо ProductModuleName-Swift.h

Это обходное решение для следующей версии Xcode. Я думаю, что эта проблема будет решена. Удачи.

Ответ 23

Мне было трудно определить имя моего модуля / objective-c импорта быстрых заголовков. Я также прочитал много статей.

Но окончательный ответ для имени вашего проекта со всеми его включенными специальными символами (будь то "." или числовым или пробелом) - вы можете найти текст, который будет работать для вас в " имени модуля продукта" под целевыми настройками сборки.

Например, мое целевое имя начиналось с числового - "1mg", а поле, указанное выше, показало "_mg" в качестве моего имени модуля.

поэтому я использовал #import "_mg-Swift.h", и он сработал.

Имя модуля продукта в настройках сборки цели дает правильное имя модуля, которое будет работать для вашего проект

Ответ 24

В моем случае мне пришлось установить цель развертывания как минимум на "OS X 10.9", а заголовок -Swift.h был автоматически сгенерирован. Имейте в виду, что при изменении целевой версии развертывания вы можете получить много предупреждений об устаревании, особенно если у вас есть старая и очень большая база кода Objective C. В нашем случае мы также много работали над XIB файлами и рассматривали классы.

Ответ 25

Если вы смогли создать проект раньше, без проблем, связанных с ошибкой "ProductModuleName-Swift.h" not found, и теперь вы снова получаете эти неприятные ошибки, причина может быть в ваших недавних изменениях.

Для меня это было (случайно) неправильным кодированием файла .swift. Возврат изменений и возврат назад вручную, выполняет задание.

Ответ 26

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

Ответ 27

Мне пришлось удалить SwOS-код WatchOS2 из моего проекта Objective C. И только после этого XCode предложил сгенерировать -Swift.h

Ответ 28

У меня была схожая проблема, но мой проект компилировался раньше и внезапно получил ошибку после изменения кода нескольких файлов. Мне потребовалось время, чтобы понять, почему я получаю ошибку "Файл не найден" для файла myproject-swift.h. Изменения кода, которые я сделал, имели некоторые ошибки. Xcode не указывал на то, что эти ошибки все время показывают "Ошибка файла не найдена". Затем получил копию кода предыдущей версии, и я сравнил с новым кодом и объединил файл один за другим. После того, как каждый файл слияния выполнил проект, чтобы найти ошибку. Итак, нижняя строка - если у вас есть ошибка в вашем коде, Xcode может просто отобразить "файл не найденной ошибки" для файла myproject-swift.h. Скорее всего, у вас есть ошибка компиляции в вашем проекте. Очистите эту ошибку, и она будет работать.

Ответ 29

Если вы используете что-то вроде Cocoapods (и разрабатываете рабочую область, а не проект), попробуйте открыть проект и создать его, прежде чем открывать рабочее пространство и здание. YMMV.

Ответ 30

Иногда вам просто нужно отменить, а затем снова установить целевое членство в файле obj-c.m.