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

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

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

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

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

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

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

  1. Проект должен иметь имя модуля продукта, которое не включает пробелы.
  2. Для параметра «Модуль» должно быть установлено значение « Да» в настройках сборки, в разделе «Упаковка».

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

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

#import “ProductModuleName-Swift.h”

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

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

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

//#import "ProductModuleName-Swift.h"

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

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

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

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

#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 -Swift.h // in each ObjectiveC .m file having to use swift classes // no matter in which swift files these classes sit. 

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

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

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

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

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

 #import  

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

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

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

Я решил включить в свой проект диаграммы IOS, но не хотел смешивать источники в одном каталоге, поэтому я поместил папку «Проекты диаграмм» рядом с папкой проекта моего кода. Я перетащил проект Charts в панель «Навигатор проекта» и включил фреймворк в список встроенных бинарных объектов проекта в общих настройках проекта и установил, что встроенный контент содержит переключатель Swift Code на «да» на вкладке « Настройки сборки» моего проекта в разделе «Параметры сборки ».

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

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

 #import "Charts/Charts-Swift.h" 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. Мой ответ: https://stackoverflow.com/a/27972946/337392

EDIT: Это из-за модификаторов public и inter-access, как я узнал в документах Apple:

По умолчанию сгенерированный заголовок содержит интерфейсы для объявлений Swift, помеченных общедоступным модификатором. Он также содержит те, которые отмечены внутренним модификатором, если в целевом приложении есть заголовок моста 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. Удалите все быстрые файлы, которые вы добавили, и скомпилируйте код без каких-либо ошибок.

———-

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

———-

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

———-

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

———-

Модуль 3.Defines должен быть установлен в «Да» в настройках сборки, в разделе «Упаковка», в вашем проекте, а не цели!

———-

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

———-

4. Теперь создайте быстрый файл или controller вида, в файле-> newFile->

———-

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

———-

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

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

———-

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

———-

6. Создайте проект и импортируйте #import «-Swift.h» в любом из controllerов aimC, и он будет работать! Вы можете щелкнуть Command-click, чтобы увидеть фактический файл!

———-

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

———-

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

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

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

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

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

  1. Прокомментируйте заявление #import «ProductModuleName-Swift.h» в файле реализации Objective-C
  2. Прокомментируйте любые ссылки в файле реализации Objective-C в Swift Classes
  3. Очистить и построить
  4. Разрешить все ошибки / предупреждения
  5. Удалить комментарий в операторе #import «ProductModuleName-Swift.h»
  6. Очистите и постройте (успешно или исправить любые оставшиеся ошибки, убедитесь, что на данный момент вы не ссылаетесь на какие-либо classы Swift в Objective-C . Если так временно прокомментировать это)
  7. Убедитесь, что «ProductModuleName-Swift.h» сгенерирован Cmd-Clicking по имени classа оператора #import «ProductModuleName-Swift.h»
  8. Удалите комментарий к коду, ссылающемуся на classы Swift в файле реализации Objective-C.
  9. Очистить и построить как обычно (необходимо создать «ProductModuleName-Swift.h», а ваш код Objective-C, ссылающийся на Swift Classes, можно использовать как обычно)

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

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

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

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

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

‘/Users/Shared/Working/abc/abc/abc-Bridging-Header.h. быстрый поиск настроек сборки целевых / проектов, чтобы сделать коррекцию вручную, и файл abc-Swift.h снова был автоматически сгенерирован.

строить-настройки

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

 #import “ProductModuleName-Swift.h” 

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

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

Вам необходимо установить опцию «Разработать проект модуля » (в настройках сборки объекта) « Да», и если ваше имя модуля имеет пробелы или тире – используйте _ во всех импортах файла [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-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/DerivedSources

Береги себя,

Джон

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

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

// # import “ProductModuleName-Swift.h”

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

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

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

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

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

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

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

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

 #import "SwiftBridge.h" 

вместо ProductModuleName-Swift.h

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

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

Но окончательный ответ для имени вашего проекта со всеми его включенными специальными символами (будь то «.» Или числовым или пробелом) – вы можете найти текст, который будет работать для вас в « Имя модуля продукта » в настройках сборки объекта ,

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

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

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

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

Если вы смогли создать проект раньше, без проблем, связанных с “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.

  • Проблема UITableView при использовании отдельного делегата / источника данных
  • Передача параметров addTarget: действие: forControlEvents
  • Как передать объект с помощью NSNotificationCenter
  • программный доступ к кнопкам громкости iPhone
  • Программно включить Bluetooth в iphone sdk?
  • Рисование поэтапно в UIView (iPhone)
  • @synthesize vs @dynamic, каковы различия?
  • Выясните, нажал ли пользователь кнопку «Назад» в controllerе uinavigation?
  • Данные перезагрузки UITableView
  • Лучший способ сохранить данные на iPhone
  • Как получить текущее название города?
  • Давайте будем гением компьютера.