Ответ 1
Теперь он работает.
- Проект должен иметь имя модуля продукта, в котором не содержит пробелы.
- Определяет, что в настройках сборки в разделе "Упаковка" должен быть установлен параметр Да.
Наконец работает. Спасибо всем за помощь: -)
Недавно я работал над добавлением Swift в существующий проект, чтобы попробовать его в реальной жизни.
После добавления исходного файла Swift в проект у меня не возникает проблем с получением "Bridging Header", то есть Objective-C для Swift.
Но файл заголовка *-Swift.h
который должен предоставлять классы Swift с пометкой @objc
или подклассы классов ObjC, нигде не найден :-(
Я не вижу каких-либо конкретных инструкций о том, как выполнить использование моего нового подкласса, написанного на Swift, в моем основном коде приложения (который все еще является Objective-C).
Приложение, которым я являюсь ведущим разработчиком, имеет довольно большую кодовую базу (70 000 строк), поэтому о его переходе за один раз не может быть и речи.
Теперь он работает.
Наконец работает. Спасибо всем за помощь: -)
У меня была аналогичная проблема, и я обнаружил, что вы можете добавить
#import "ProductModuleName-Swift.h"
для obj-c.m файлов, а не файлов .h для заголовка зонтика, который будет найден
Я обнаружил, что мне пришлось исправить все ошибки сборки до того, как он сгенерирует файл.
Проблема для меня заключалась в том, что это была проблема с курицей/яйцом, потому что я не видел никаких ошибок сборки, пока я фактически не прокомментировал инструкцию #import
:
//#import "ProductModuleName-Swift.h"
который обнаружил кучу других ошибок в моем коде Swift.
Как только я исправил эти новые ошибки и получил исходное здание успешно, я раскомментировал #import
и бинго! Заголовок был создан и импортирован правильно:)
Если у вашего имени модуля проекта есть пробелы в нем, вы должны заменить пробелы символом подчеркивания.
Например, если ваше имя проекта "Мой проект", вы должны использовать:
#import "My_Project-Swift.h"
Если вы похожи на меня, вы, вероятно, неправильно назвали заголовок. После того, как я немного потрепал голову, я искал файл в DerivedData и, конечно же, там. По моей настройке (я полагаю, используя стандартную папку с данными):
cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'
Найдет. Если ничего в этой папке не соответствует, то Xcode не генерирует его.
Я использую Xcode Version 6.2 (6C86e)
* Важно только: *
использовать указанное целевое имя "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...
Я хотел добавить еще одну причину, по которой вы можете найти проблему с этим - я создавал фреймворк, который смешивал Swift и Objective-C. Я не смог импортировать классы Swift вне рамки - я проверил файл -Swift.h и был сгенерирован, но был пуст.
Проблема оказалась очень-очень простой - я не объявлял ни одного из моих классов Swift открытым! Как только я добавил ключевое слово public в классы, я смог использовать их из классов внутри и вне рамки.
Также обратите внимание, что внутри фреймворка (внутри .m файлов только как упоминается другой ответ) мне пришлось импортировать файл -Swift.h как:
#import <FrameworkName/FrameworkName-Swift.h>
У меня была та же проблема. Похоже, вам нужно настроить параметры (Определяет модуль и имя модуля продукта) до, вы добавляете свой первый файл Swift.
Если вы сделаете это, файл "* -Swift.h" не будет создан для этого проекта, даже если вы добавите дополнительные файлы Swift или удалите файл Swift и создадите новый.
Имя файла всегда предшествует имени Target. Он называется названием продукта, но фактически это имя цели.
Поэтому, если вы хотите, чтобы он создавал новую цель, можно было ожидать ожидать that_target-Swift.h
файла.
Один из способов справиться с этим -
MY_TARGET=1
. Добавьте это в Настройки проекта → Настройки сборки → Макросы препроцессора для каждой из ваших целей.Добавьте эти строки в файл PCH
#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h"
#endif
Преимущество использования файла PCH заключается в том, что вам не нужно включать заголовки везде.
Это должно работать нормально.
Вот еще одна вариация модуля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"
Модулям, отображающим мои данные проекта.
Позвольте мне поделиться своим опытом, пытаясь использовать 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
Если XCode фактически генерирует ваш заголовок -Swift.h (глубоко внутри DerivedData), но он не ссылается на ваши классы Swift, убедитесь, что у вас также определен мостовой заголовок. То, как я читал документы, подразумевало, что мне нужно только это для вызова Objective-C из Swift, но, похоже, это необходимо и для вызова Swift из Objective-C.
Смотрите мой ответ: fooobar.com/questions/29703/...
ОБНОВЛЕНИЕ: Это из-за общественных и внутренних модификаторов доступа, как я в конечном итоге нашел объяснил в документации Apple: -
По умолчанию сгенерированный заголовок содержит интерфейсы для Swift объявления, помеченные модификатором public. Он также содержит те помечается внутренним модификатором, если цель вашего приложения имеет Objective-C соединительный заголовок.
Покоряйте, что много людей здесь, но добавив увлекательный скриншот. Быстрые и Obj-C-коды, безусловно, могут жить вместе. Это не все или ни одна игра.
Для доступа к файлам Swift в вашем Objective-C все, что вам нужно сделать, это добавить этот вызов в ваш файл Obj-C (в файле .m/implementation):
#import "{product_module_name}-Swift.h"
(Где {product_module_name} представляет имя модуля продукта вашего проекта). Вместо того, чтобы пытаться угадать имя вашего модуля продукта или определить угловые случаи с пробелами и специальными символами, просто перейдите на вкладку настроек сборки в проекте и введите "имя модуля продукта" - инспектор раскроет вам. Мой был тем, чего я не ожидал. Проверьте этот снимок экрана, если вы смущены.
И чтобы получить код Obj-c, работающий в Swift, вам просто нужно добавить заголовочный файл моста и импортировать соответствующие заголовки Obj-C.
Хорошо, вот все, что вам действительно нужно!
1. Удалите все добавленные вами файлы swift и скомпилируйте код без ошибок.
2. Перейдите к настройкам сборки "Проекты" и задайте имя модуля продукта. Проект должен иметь имя модуля продукта, которое не содержит пробелов.
3.Defines Module должен быть установлен в Yes в настройках сборки, в разделе Packaging, в вашем проекте, а не в цель!
4. Теперь создайте файл swift или контроллер представления, в file-> new file->
Он попросит создать bridging-header, позволить ему сделать таковой. Если вы отклонили его один раз, вам придется вручную добавить -Bridging-Header.h
5.Добавьте @objc в контроллер, чтобы сообщить компилятору, что существует некоторый файл swift, который необходимо открыть для ObjectiveC.
6.Скомпилируйте проект и импортируйте #import "-Swift.h" в любой из контроллеров targetC, и он будет работать! Вы можете щелкнуть по нему, чтобы увидеть актуальный файл!
Надеюсь это поможет!
Самое главное, что Этот файл невидим!!! По крайней мере, он находится в Xcode6 beta5. В вашем рабочем пространстве не будет такого файла с именем "YourModule-Swift.h". Просто убедитесь, что у вас есть имя модуля и определяет модуль, установленный в yes, и используйте его в своем классе Objective-C.
В этом ответе рассматривается прецедент, в котором у вас может быть код Objective-C, который вызывает классы Swift, и затем вы начинаете получать эту ошибку.
Как исправить проблему
Следующие шаги в конечном итоге разрешили все проблемы для меня. Я читал выше, когда кто-то упоминал "курицу и яйцо", и именно эта концепция привела меня к этой процедуре. Этот явный процесс показывает, что нужно удалить любой код Objective-C, ссылающийся на классы Swift, до тех пор, пока не будет сгенерирован заголовок.
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 был снова сгенерирован автоматически.
Вам нужно импортировать заголовок в классах Objective-C, который:
#import "ProductModuleName-Swift.h"
Он автоматически генерируется, в ссылке говорится: "Любые файлы Swift в вашей цели будут видны в файлах Objective-C.m, содержащих этот оператор импорта".
Фактический файл в проекте не создан ([ProductModuleName] -Swift.h). Cmd + Щелкните по импорту или генерирует его "на лету" (и в памяти), чтобы вы могли видеть, как выполняется ссылка, или открывает файл где-нибудь в каком-то кеше Xcode, но это не в директории проекта.
Вам нужно установить Определить модуль project prop (в целевых настройках сборки) на Да, и если ваше имя модуля имеет пробелы или тире - используйте _ во всех импортах [ProductModuleName] -Swift.h.
Вы можете импортировать его во все файлы .h и .m, где вы используете быстрые типы, или можете импортировать его в .pch.
Итак, если мой модуль (проект) назван "Test Project", я бы импортировал его так, в .pch файле моего проекта (только там):
#import "Test_Project-Swift.h"
Просто голова для всех, кто использовал "." в там название проекта. 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
Позаботьтесь,
Джон
Проект должен иметь имя модуля, которое не включает пробелы. Для параметра "Модуль" должно быть установлено значение "Да" в настройках сборки, в разделе "Упаковка". прокомментировал оператор #import:
Если у вас возникла ошибка при импорте "ProductModuleName-Swift.h", то
//# import "ProductModuleName-Swift.h"
который обнаружил кучу других ошибок в моем коде Swift.
Как только я исправил эти новые ошибки и получил исходное здание успешно, я раскомментировал #import и bingo! Заголовок был создан и импортирован правильно:)
Я нашел трюк, который всегда работает на меня.
Сделайте эту работу (удалите и создайте "ProductModuleName-Swift.h" из файла appDelegate.h и очистите свой код) каждый раз, когда вы получаете эту ошибку, чтобы ее отключить.
Я нашел это решение
Теперь вы можете
#import "SwiftBridge.h"
вместо ProductModuleName-Swift.h
Это обходное решение для следующей версии Xcode. Я думаю, что эта проблема будет решена. Удачи.
Мне было трудно определить имя моего модуля / objective-c импорта быстрых заголовков. Я также прочитал много статей.
Но окончательный ответ для имени вашего проекта со всеми его включенными специальными символами (будь то "." или числовым или пробелом) - вы можете найти текст, который будет работать для вас в " имени модуля продукта" под целевыми настройками сборки.
Например, мое целевое имя начиналось с числового - "1mg", а поле, указанное выше, показало "_mg" в качестве моего имени модуля.
поэтому я использовал #import "_mg-Swift.h", и он сработал.
В моем случае мне пришлось установить цель развертывания как минимум на "OS X 10.9", а заголовок -Swift.h
был автоматически сгенерирован. Имейте в виду, что при изменении целевой версии развертывания вы можете получить много предупреждений об устаревании, особенно если у вас есть старая и очень большая база кода Objective C. В нашем случае мы также много работали над XIB файлами и рассматривали классы.
Если вы смогли создать проект раньше, без проблем, связанных с ошибкой "ProductModuleName-Swift.h" not found
, и теперь вы снова получаете эти неприятные ошибки, причина может быть в ваших недавних изменениях.
Для меня это было (случайно) неправильным кодированием файла .swift
. Возврат изменений и возврат назад вручную, выполняет задание.
Это может быть очевидным моментом (может быть, слишком очевидным), но у вас должен быть хотя бы один быстрый файл в проекте для генерируемого заголовка. Если вы пишете шаблон шаблона или код конфигурации с намерением записать быстро, импорт не будет работать.
Мне пришлось удалить SwOS-код WatchOS2 из моего проекта Objective C. И только после этого XCode предложил сгенерировать -Swift.h
У меня была схожая проблема, но мой проект компилировался раньше и внезапно получил ошибку после изменения кода нескольких файлов. Мне потребовалось время, чтобы понять, почему я получаю ошибку "Файл не найден" для файла myproject-swift.h. Изменения кода, которые я сделал, имели некоторые ошибки. Xcode не указывал на то, что эти ошибки все время показывают "Ошибка файла не найдена". Затем получил копию кода предыдущей версии, и я сравнил с новым кодом и объединил файл один за другим. После того, как каждый файл слияния выполнил проект, чтобы найти ошибку. Итак, нижняя строка - если у вас есть ошибка в вашем коде, Xcode может просто отобразить "файл не найденной ошибки" для файла myproject-swift.h. Скорее всего, у вас есть ошибка компиляции в вашем проекте. Очистите эту ошибку, и она будет работать.
Если вы используете что-то вроде Cocoapods (и разрабатываете рабочую область, а не проект), попробуйте открыть проект и создать его, прежде чем открывать рабочее пространство и здание. YMMV.
Иногда вам просто нужно отменить, а затем снова установить целевое членство в файле obj-c.m.