Недавно я работал над тем, чтобы добавить Swift в существующий проект, чтобы попробовать его в реальной жизни.
После добавления исходного файла Swift в проект у меня не возникает проблем с получением «Bridging Header», то есть Objective-C для Swift.
Но *-Swift.h
файл заголовка, который должен представлять классы Swift либо помеченные, @objc
либо подклассы классов ObjC, нигде не найден :-(
Я не вижу конкретных инструкций о том, как выполнить использование моего нового подкласса, написанного на Swift, в моем основном коде приложения (который по-прежнему Objective-C).
Приложение, которым я являюсь ведущим разработчиком, имеет довольно большую кодовую базу (70 000 строк), поэтому о его переходе за один раз не может быть и речи.
objective-c
xcode
swift
Дэвид Кристенсен
источник
источник
Ответы:
Теперь это работает.
Наконец работает. Спасибо всем за помощь :-)
источник
Build Settings
подPackaging
мойDefines Module
установленYes
и я создалProduct Module Name
без пробелов. "* -Swift.h" не генерируется XCode 6. ???Defines Module
установил иYes
для проекта и для цели, иProduct Module Name
определен, без пробелов , но я не могу создать этот файл.У меня была похожая проблема, и я обнаружил, что вы можете только добавить
#import "ProductModuleName-Swift.h"
к файлам obj-c .m, а не к файлам .h для заголовка зонтика.
источник
Я обнаружил, что должен был исправить все ошибки сборки, прежде чем он сгенерирует файл.
Проблема для меня заключалась в том, что это была проблема курица / яйцо, поскольку я не видел никаких ошибок сборки, пока я фактически не закомментировал
#import
утверждение://#import "ProductModuleName-Swift.h"
который выявил кучу других ошибок в моем коде Swift.
После того, как я исправил эти новые ошибки и успешно получил сборку исходного кода, я раскомментировал
#import
и бинго! Заголовок был создан и импортирован правильно :)источник
Если вы похожи на меня, вы, вероятно, ошиблись названием заголовка. После того, как я немного ударился головой, я искал файл в DerivedData и, конечно же, он там есть. На моей установке (я полагаю, используя стандартную папку производных данных):
Найдем это. Если ничего в этой папке не совпадает, Xcode не генерирует его.
Я использую версию Xcode 6.2 (6C86e)
источник
-Swift.h
а не имя моего фактического файла Swift. Спасибо!Если в имени вашего модуля проекта есть пробелы, вы должны заменить пробелы подчеркиванием.
Например, если имя вашего проекта «Мой проект», вы должны использовать:
источник
* Единственная важная вещь: *
использовать определенное «Имя модуля продукта» в цели, а затем -Swift.h
Независимо от того, установлено ли для параметра «Определить модуль» значение «Да» или «Нет», или если проект «Имя модуля продукта» не установлен.
Напоминание: классы Swift должны быть производными от NSObject или отмечены атрибутом @objc, чтобы быть доступными для ObjectiveC / Foundation || Какао ...
источник
Я хотел бы добавить еще одну причину, по которой вы можете столкнуться с этой проблемой - я создавал среду, которая смешивала код Swift и Objective-C. Я не смог импортировать классы Swift вне фреймворка - я проверил файл -Swift.h, и он генерировался, но был пустым.
Проблема оказалась очень, очень простой - я не объявил ни один из моих классов Swift публичным! Как только я добавил ключевое слово public в классы, я смог использовать их из классов внутри и вне фреймворка.
Также следует отметить, что внутри фреймворка (внутри файлов .m только в другом ответе упоминается) мне пришлось импортировать файл -Swift.h как:
источник
У меня такая же проблема. Похоже, вам нужно настроить параметры (определяет модуль и имя модуля продукта), прежде чем добавить свой первый файл Swift.
Если вы сделаете это позже, файл "* -Swift.h" не будет создан для этого проекта, даже если вы добавите дополнительные файлы Swift или удалите файл Swift и создадите новый.
источник
Позвольте мне поделиться своим опытом использования Swift в старом проекте objc. Мне не нужно было устанавливать
Defines module
наYES
.В моем случае мне нужно было вручную убедиться, что есть объект Bridging Header. Только сгенерированное имя заголовка интерфейса присутствовало в моих настройках сборки.
Это привело к созданию файла MyApp-Swift.h, но без каких-либо следов моих классов Swift.
В документации Apple говорится, что вам будет предложено создать промежуточный заголовок при добавлении вашего первого файла swift. Ну, я не был. Я вручную добавил
MyApp-Bridging-header.h
файл и указал на него в поле «Заголовок моста Objective C». Это сделало мой файл MyApp-Swift.h заполненным моими классами Swift.Документы: импорт Swift в Objective-C
источник
Вот еще один вариант moduleName-Swift.h, который не генерируется.
Я решил включить Диаграммы IOS в свой проект, но не хотел смешивать источники в одном каталоге, поэтому я поместил папку Проект диаграмм рядом с папкой проекта моего кода. Я перетащил проект Charts в панель навигатора моего проекта и включил каркас в список встроенных двоичных файлов целевого объекта моего проекта в общих настройках проекта и установил переключатель « Код встроенного содержимого содержит Swift Code» в положение «да» на вкладке « Параметры сборки» моего проекта в разделе «Параметры сборки ».
Файл moduleName-Swift.h моего проекта никогда не будет генерироваться независимо от того, какие другие параметры или параметры предложены здесь. Наконец, используя метод Лу Z для поиска файлов -Swift.h, я увидел, что файл Charts-Swift.h генерируется глубоко в каталоге xcode Build моего проекта в Charts.framework / Headers /
Решением использования пакета Swift ios-charts Даниэля Джинди без включения кода в исходный каталог моего проекта было добавить:
Для модулей, составляющих схему данных моего проекта.
источник
Имя файла всегда предшествует вашему имени цели . Это называется именем продукта, но практически это целевое имя. Поэтому, если вы хотите, чтобы он создавался для новой цели, будьте готовы ожидать
that_target-Swift.h
файл.Один из способов справиться с этим
MY_TARGET=1
, Добавьте это в Настройки проекта-> Настройки сборки-> Макросы препроцессора для каждой из ваших целей.Добавьте эти строки в файл PCH
Преимущество использования файла PCH заключается в том, что вам не нужно включать заголовки везде.
Это должно работать просто отлично.
источник
include
в него). Затем я импортирую этот новый файл оттуда, где он мне нужен. Я предпочитаю не помещать это в PCH или любой файл .h, чтобы избежать циклических зависимостей и использовать вспомогательный заголовок в файлах .m..pch
файлы сильно не рекомендуется . Во-вторых, имя файла содержит имя продукта, а НЕ имя цели вообще. Это может быть совпадением, что это то же самое, но оно использовало название продукта!Если Xcode фактически генерирует ваш заголовок -Swift.h (глубоко внутри DerivedData), но он не ссылается на ваши классы Swift, убедитесь, что у вас также определен мостовой заголовок. То, как я читал документы, подразумевало, что мне нужно только это для вызова Objective-C из Swift, но, похоже, это необходимо и для вызова Swift из Objective-C.
Смотрите мой ответ: https://stackoverflow.com/a/27972946/337392
РЕДАКТИРОВАТЬ: Это из-за общественных и внутренних модификаторов доступа, как я в конечном итоге нашел объяснил в документации Apple:
источник
Разберитесь с тем, что есть у многих людей, но добавьте соответствующий снимок экрана. Код Swift и Obj-C, безусловно, могут жить вместе. Это не игра «все или ничего».
Чтобы получить доступ к файлам Swift в Objective-C, все, что вам нужно сделать, это добавить этот вызов в ваш файл Obj-C (в файле .m / creation):
(Где {product_module_name} представляет имя модуля продукта вашего проекта). Вместо того, чтобы пытаться угадать имя модуля вашего продукта или определить угловые случаи с пробелами и специальными символами, просто перейдите на вкладку «Параметры сборки» в проекте и введите «имя модуля продукта» - инспектор покажет вам ваше. Мое было то, чего я не ожидал. Посмотрите на этот снимок экрана, если вы запутались.
А чтобы заставить код Obj-c работать в Swift, вам просто нужно добавить файл заголовка моста и импортировать туда соответствующие заголовки Obj-C.
источник
#import
?Самое главное, что этот файл невидим !!! По крайней мере, это в Xcode6 beta5. В вашей рабочей области не будет такого файла с именем «YourModule-Swift.h». Просто убедитесь, что у вас есть имя модуля и он определен как yes, и используйте его в своем классе Objective-C.
источник
Хорошо, вот все, что вам действительно нужно!
1. Удалите все добавленные вами файлы swift и скомпилируйте код без ошибок.
----------
----------
2. Перейдите в настройки сборки «Проекты» и задайте имя модуля продукта. Проект должен иметь имя модуля продукта, которое не содержит пробелов.
----------
----------
3.Defines Module должен быть установлен в Yes в настройках сборки, в разделе Packaging, в вашем проекте, а не в цель!
----------
----------
4. Теперь создайте файл swift или контроллер представления в file-> newFile->
----------
----------
Он попросит создать bridging-header, позволить ему сделать таковой. Если вы отклонили его один раз, вам придется вручную добавить -Bridging-Header.h
5. Добавьте @objc в контроллер, чтобы сообщить компилятору, что существует некоторый файл swift, который необходимо открыть для ObjectiveC
----------
----------
6.Скомпилируйте проект и импортируйте #import "-Swift.h" в любой контроллер targetC, и он будет работать! Вы можете Ctrl-клик по нему, чтобы увидеть фактический файл!
----------
----------
Надеюсь это поможет!
источник
Этот ответ касается варианта использования, когда у вас уже может быть какой-то код Objective-C, который вызывает классы Swift, и вы начинаете получать эту ошибку.
Как исправить проблему
Следующие шаги в конечном итоге решили все проблемы для меня. Я прочитал выше, кто-то упоминает «курица и яйцо», и именно эта концепция привела меня к этой процедуре. Этот явный процесс показывает, что нужно удалить любой код Objective C, ссылающийся на классы Swift, до тех пор, пока не будет сгенерирован заголовок.
Примечание: ответы об изменении пробелов на подчеркивания и определения модуля на YES, приведенные выше, по-прежнему применяются при выполнении этого процесса, как и правила, указанные в документации Apple .
Мостовой путь заголовка
При одной ошибке файл ProductModuleName-Bridging-Header.h не был найден в процессе сборки. Этот факт породил ошибку
Более тщательная проверка ошибки показала, что файл никогда не будет существовать в указанном месте, потому что он действительно был расположен ( неправильный путь )
'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h. быстрый поиск настроек сборки цели / проектов, чтобы сделать исправление вручную, и файл abc-Swift.h был снова автоматически сгенерирован.
источник
Вы должны импортировать заголовок в классах Objective C, который является:
Он генерируется автоматически по ссылке: «Все файлы Swift в вашей цели будут видны в файлах Objective-C .m, содержащих эту инструкцию импорта».
источник
Фактический файл в проекте не создан ([ProductModuleName] -Swift.h). Cmd + Нажмите на импорт либо генерирует его на лету (и в памяти), чтобы вы могли видеть, как осуществляется связывание, либо открывает файл где-то в некоторой директории кэша Xcode, но его нет в директории проекта.
Вам нужно установить опору проекта Defines Module (в настройках сборки цели) на Yes а если имя вашего модуля содержит пробелы или тире - использовать _ во всех импорте файла [ProductModuleName] -Swift.h.
Вы можете импортировать его во все файлы .h и .m, где вы используете быстрые типы, или вы можете импортировать его в .pch.
Поэтому, если мой Модуль (проект) называется «Тестовый проект», я импортировал бы его следующим образом в файл .pch моего проекта (только там):
источник
Просто хедз-ап для тех, кто использовал "." там имя проекта. Xcode заменит "." с подчеркиванием "_" для Swift-версии файла заголовка моста. Как ни странно, генерируемый Bridging-Header.h не заменяет точки подчеркиванием.
Например, проект с именем My.Project будет иметь следующие имена файлов заголовка моста.
Bridging-Header.h (автоматически)
My.Project-Bridging-header.h
Swift.h
My_Project.h
Я надеюсь, что это поможет любому, кто использовал период и застрял, как я. Этот файл можно найти в следующем месте.
Macintosh HD / Пользователи / пользователь /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/Derived
Береги себя,
Джон
источник
Проект должен иметь имя модуля без пробелов. Определяет модуль должен быть установлен на Да в настройках сборки, в разделе Упаковка. прокомментировал утверждение #import:
Если все еще у вас возникла ошибка при импорте «ProductModuleName-Swift.h», то
// # import "ProductModuleName-Swift.h"
который выявил кучу других ошибок в моем коде Swift.
После того, как я исправил эти новые ошибки и успешно собрал сборку исходного кода, я раскомментировал #import и bingo! Заголовок был создан и импортирован правильно :)
источник
Я нашел трюк, который всегда работает на меня.
Выполняйте эту работу (удаляйте и создавайте файл «ProductModuleName-Swift.h» из файла appDelegate.h и очищайте код) каждый раз, когда вы получаете эту ошибку, чтобы заставить ее замолчать.
источник
Я нашел это решение
Теперь вы можете
вместо ProductModuleName-Swift.h
Это обходное решение, для следующей версии Xcode я думаю, что эта проблема будет решена. Удачи
источник
#import “ProductModuleName-Swift.h”
появляется ошибка в файле SwiftBridge.h вместо исходного файла кода Objective-C.Я с трудом определял, как мой модуль / target-c импортирует заголовки swift. Я тоже прочитал много статей здесь.
Но окончательный ответ для названия вашего проекта со всеми включенными в него специальными символами (будь то '.' Или цифрой или пробелом) - вы можете найти текст, который будет работать для вас, в « Название модуля продукта » в настройках сборки цели. ,
Например, мое целевое имя начиналось с цифры - «1 мг», а в поле, указанном выше, в качестве имени моего модуля было указано «_mg».
поэтому я использовал #import "_mg-Swift.h", и это сработало.
источник
В моем случае я должен был установить цель развертывания как минимум «OS X 10.9», и
-Swift.h
заголовок был автоматически сгенерирован. Помните, что при изменении целевой версии развертывания вы можете получить множество предупреждений об устаревании, особенно если у вас более старая и очень большая база кода Objective C. В нашем случае у нас также было много работы в файлах XIB и классах просмотра.источник
Если раньше вам удавалось построить проект без проблем, связанных с
“ProductModuleName-Swift.h” not found
ошибками, а теперь вы снова получаете эти неприятные ошибки, причина может заключаться в ваших последних изменениях.Для меня это было (случайно) неправильной
.swift
кодировкой файла. Возврат изменений и возвращение обратно вручную, делает работу.источник
Это может быть очевидным моментом (может быть, слишком очевидным), но для создания заголовка у вас должен быть хотя бы один файл swift в проекте. Если вы пишете шаблон или код конфигурации с намерением написать swift позже, импорт не будет работать.
источник
Мне пришлось удалить код Swift WatchOS2 из моего проекта Objective C. И только после этого XCode предложил сгенерировать -Swift.h
источник
У меня была похожая проблема, но мой проект компилировался раньше и внезапно получил ошибку после нескольких изменений кода файлов. Мне потребовалось время, чтобы выяснить, почему я получаю ошибку «Файл не найден» для файла myproject-swift.h. Изменения кода, которые я сделал, имели некоторые ошибки. XCode не указывал, чтобы поставить эти ошибки вместо этого все время показывая «Ошибка файла не найдена». Затем я получил копию кода предыдущей версии, и я сравнил новый код с одним файлом. После каждого слияния файла выполняется проект, чтобы найти ошибку. Итак, суть в том, что если у вас есть ошибка в вашем коде, Xcode может просто отображать «file not found error» для файла myproject-swift.h. Скорее всего, у вас есть ошибка компиляции в вашем проекте. Очистите эти ошибки, и это будет работать.
источник
Если вы используете что-то вроде Cocoapods (и работаете не из проекта, а из рабочей области), попробуйте открыть проект и собрать его перед открытием рабочей области и сборкой. YMMV.
источник
Иногда вам просто нужно сбросить и снова установить целевое членство в файле obj-c .m.
источник