Перейдите к заголовку Objective C, не созданному в Xcode 6


242

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

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

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

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

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


5
Да, это так. Это действительно вопрос, где в XCode IDE нужно что-то сделать, чтобы создать этот Swift-> ObjC-заголовок, поскольку это не происходит "по умолчанию" при добавлении кода Swift в существующий проект ObjC.
— Дэвид Кристенсен

5
@Popeye Я не согласен. В этом случае, если вы редактируете файлы и компилируете из командной строки, вы не увидите этой проблемы. Проблема заключается в том, что IDE выполняет (или должна выполнять) от вашего имени. Скорее всего, это связано с настройкой проекта, которая определенно является функцией IDE
— gaige

11
@Popeye Из документов (PDF) : Когда вы импортируете код Swift в Objective-C, вы полагаетесь на сгенерированный Xcode файл заголовка, чтобы открыть эти файлы для Objective-C. (Мой жирный шрифт, курсив Apple.) Это, очевидно, вопрос о функции Xcode, которая помогает вам использовать Swift и Objective-C вместе, и все три тега, безусловно, подходят.
— Калеб

3
Я решил это с помощью gaige и документации. И я не просто добавляю тег: в этом случае файл заголовка ДОЛЖЕН быть создан и видим для XCode. Это не было, таким образом, приводя к ошибкам.
— Дэвид Кристенсен

3
@Popeye В этом нет ничего неверного - я скопировал цитату прямо со страницы 46. Вы нашли похожий, но другой отрывок, в котором говорится более или менее об одном и том же.
— Калеб

Ответы:


165

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

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

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


64
В Build Settingsпод Packagingмой Defines Moduleустановлен Yesи я создал Product Module Nameбез пробелов. "* -Swift.h" не генерируется XCode 6. ???
— Loozie

25
Еще одно примечание: я сначала попытался установить упомянутые свойства на целевом уровне, и это не сработало, файл "* -Swift.h" не был создан. Это сработало, когда я установил его на уровне проекта.
— Марчин

22
У меня тоже такая же проблема. Я Defines Moduleустановил и Yesдля проекта и для цели, и Product Module Nameопределен, без пробелов , но я не могу создать этот файл.
— Крейг Отис

8
На всякий случай, если другие так же запутались, как и я ... Мне пришлось слепо везти и просто импортировать заголовок, так как он не заполнялся автоматически.
— Шонуолл

14
Вы не можете импортировать -swift для заголовочных файлов (.h) только в реализации.
— zirinisp

122

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

#import "ProductModuleName-Swift.h"

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


2
Это правильно, и ... что если мне нужно использовать класс Swift в заголовке objc? Я попытался с предварительным объявлением, это также не работает.
— 1

2
Ой, извините, форвард декларация работает. Я забыл добавить точку с запятой: P
— Ixx

14
Для будущих поисковиков: в своих заголовках отправьте объявление, выполнив @class YourSwiftClass в верхней части ваших файлов .h (вместо импорта зонтичного заголовка)
— rogueleaderr

4
Что делать, если мне нужно использовать перечисление Swift в заголовочном файле?
— jakecraige

1
Кроме того, если «#import ProductModuleName-Swift.h» находится в любом заголовочном файле, то файл ProductModuleName-Swift.h не будет создан вообще (начиная с Xcode 7.2), поэтому, если он был удален (например, путем очистки сборки папка), тогда вы увидите сообщения об ошибках везде, что файл импортируется, даже для файлов .m, что добавляет путаницы.
— Рене

59

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

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

//#import "ProductModuleName-Swift.h"

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

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


Спасибо, это именно то, что удерживало меня. После исправления ошибок быстрой сборки мне было хорошо идти. (Версия XCode 6.1.1)
— Рик Робертс

10
Это отличный момент и хорошая причина, чтобы включить настройку «продолжить сборку после ошибок» в Xcode.
— Кендалл Хельмштеттер Гелнер

Это тоже мой случай: пропал -Swift-h, произошедший после тех же изменений в быстром исходном коде
— Джорджио Кальцолато

3
Увидев проблему с курицей и яйцом, я понял свою проблему. Хорошая аналогия
— d0ye

Эта проблема всегда возвращалась ко мне (Xcode10), и я просто интерпретировал Xcode как глючный. Это был ответ, хотя
— SumakuTension

44

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

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

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

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


Это сделало это для меня. Я думал, что автозаполнение подхватит это, что я просто предположил, что его там не было. Увидев в каталоге все прояснилось.
— Будет

Иногда видение - это вера. Я не мог заставить все работать до тех пор, пока не следовал рекомендованному ответу, а затем использовал эти шаги, чтобы найти сгенерированный заголовок, к которому, к моему удивлению, был добавлен постфикс, -Swift.hа не имя моего фактического файла Swift. Спасибо!
— Джош Хабдас

Спасибо!
— Сэкономил

43

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

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

#import "My_Project-Swift.h"


12
Если в имени модуля вашего проекта есть дефисы, их также следует заменить подчеркиванием. Поэтому, если ваш проект называется «My-Project», используйте #import «My_Project.h»
— Джефф Эймс,

6
Кроме того, если имя модуля вашего проекта начинается с цифры, его также следует заменить подчеркиванием. «Первый проект» будет «_st_Project-Swift.h»
— Danation

31

* Единственная важная вещь: *

использовать определенное «Имя модуля продукта» в цели, а затем -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 || Какао ...


1
Это правда: нет необходимости "Определять модуль" в проекте или в цели
— Джорджио Кальцолато

25

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

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

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

#import <FrameworkName/FrameworkName-Swift.h>

2
В Framework я также отмечаю, что для использования классов Swift они должны быть унаследованы от NSObject (даже @objc не поможет), и все методы / свойства должны быть открытыми.
— дмитриниколаев

3
По крайней мере, в текущей предварительной версии XCode 7, пока вы не унаследуете от NSObject, они не будут доступны в сгенерированном быстром заголовке.
— дмитриниколаев

100% НЕ решило мою проблему. КАЖДЫМ решением является «сделать ваши уроки публичными». Я сделал это. Период. Он по-прежнему НЕ раскрывает классы Swift в проектах, которые используют фреймворк.
— datWooWoo

@lespommes, вы должны написать вопрос и создать образец проекта, в котором будет показана проблема, кто-то может выяснить, что происходит ... Я просто дал свой ответ как одно из возможных решений, потому что это ошибка видимости, которую я делаю больше всего. часто.
— Кендалл Хельмштеттер Гелнер

2
Ах да, твой намек на импорт наконец помог мне! Большое спасибо!
— endowzoner

14

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

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


Я не уверен, что это правда. Я не решил включить «Defines Module», пока не создал много быстрых файлов, и я смог получить -Swift.h очень хорошо.
— Майкл Петерсон

Мне действительно грустно сообщать, что это именно та проблема, с которой я столкнулся :( Мне пришлось удалить свой .swift и заново добавить его, а затем все
— заработало

2
Что теперь? Я нахожусь в процессе изменения кода Swift и ObjC. Мой Project-Swift.h не обновляется. Я даже пытался удалить файл заголовка.
— Сухай Бхат,

2
Я должен был написать это, dev.iachieve.it/iachtainedit/?p=980 . Совет по обновлению настроек сборки перед добавлением файлов Swift был для меня ключевым.
— Джо

Значит ли это, что мне придется пересоздать проект и заново добавить все, если я этого не сделал? Независимо от того, что я делаю, я не могу получить файл * -Swift.h для генерации.
— кгреенек

13

Позвольте мне поделиться своим опытом использования 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


да, по какой-то причине мой файл ObjC Swift.h был сгенерирован с заголовками классов Swift только после того, как я добавил пустой заголовочный файл моста в проект!
— Андрей

Тоже самое. Мой код Swift не был импортирован в сгенерированный файл * -Swift.h, пока я не добавил пустой заголовочный файл моста Objective-C.
— Ник

12

Вот еще один вариант moduleName-Swift.h, который не генерируется.

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

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

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

#import "Charts/Charts-Swift.h"

Для модулей, составляющих схему данных моего проекта.


Можно ли изменить / настроить подсказку в диаграммах IOS? если да, то можете ли вы привести один пример?
— Амит Чаухан

12

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

Это должно работать просто отлично.


Мне действительно нравится использовать это решение вместо импорта заголовка прямо в ваш источник. У меня сложная структура проекта, где один и тот же исходный код используется несколькими целями / проектами. Это позволяет избежать добавления грязного оператора #if #else по всему моему коду. Спасибо за ответ!
— Райан

Это спасло мой день. Я поместил 5 строк кода в файл «Something-Swift-Headers.h» (с включенным includeв него). Затем я импортирую этот новый файл оттуда, где он мне нужен. Я предпочитаю не помещать это в PCH или любой файл .h, чтобы избежать циклических зависимостей и использовать вспомогательный заголовок в файлах .m.
— 15:33

Это не правильно на многих уровнях. Во-первых, .pchфайлы сильно не рекомендуется . Во-вторых, имя файла содержит имя продукта, а НЕ имя цели вообще. Это может быть совпадением, что это то же самое, но оно использовало название продукта!
— Юлиан Онофрей

10

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

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

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

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


Да, это действительно помогло. Я этого не знал. Я думал, что это просто необходимо для варианта использования Obj-C от Swift.
— nodepond 16.12.15

Рад был помочь. Я отредактировал ответ, потому что с тех пор я выяснил причину такого поведения.
— Эшелон

7

Разберитесь с тем, что есть у многих людей, но добавьте соответствующий снимок экрана. Код Swift и Obj-C, безусловно, могут жить вместе. Это не игра «все или ничего».

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

#import "{product_module_name}-Swift.h"

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

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

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


1
Не должно ли это быть #import?
— Юлиан Онофрей

Допустим, мой проект называется ABC, тогда в моем проекте должен существовать «ABC-Swift.h», верно? Я не могу найти это. Нужно ли создавать его вручную? Я не создаю никаких быстрых файлов сам, только включая стручок какао, который написан на быстром.
— №5

Заголовок моста (в вашем случае ABC-Swift.h) не создается автоматически. Когда вы пытаетесь создать свой первый файл Swift в проекте Obj-C, XCode обычно предлагает вам добавить его. Вы также можете создать заголовок Bridging самостоятельно, как показано здесь (control + f для «заголовка моста»): developer.apple.com/library/content/documentation/Swift/…
— Брайан Сашетта,

5

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


5

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

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-клик по нему, чтобы увидеть фактический файл!

----------

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

----------

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


>> Вы можете нажать Ctrl-клик по нему, чтобы увидеть актуальный файл! Это круто
— Джаган

4

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

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

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

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

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

Мостовой путь заголовка

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

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

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

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

сборки-установки


1
Что если ваш проект настолько велик, что комментировать все ссылки на быстрый код в цели c нецелесообразно?
— Эндрю Моррис

3

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

#import “ProductModuleName-Swift.h”

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


24
Но когда я это делаю, я получаю ошибку сборки, AppName-Swift.h не существует. Принимая во внимание, что AppName-Bridging-Header.h существует.
— Дэвид Кристенсен

5
@DavidKristensen: Вы получили решение ?, поскольку я застрял с той же самой проблемой
— BaSha

2

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

Вам нужно установить опору проекта Defines Module (в настройках сборки цели) на Yes а если имя вашего модуля содержит пробелы или тире - использовать _ во всех импорте файла [ProductModuleName] -Swift.h.

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

Поэтому, если мой Модуль (проект) называется «Тестовый проект», я импортировал бы его следующим образом в файл .pch моего проекта (только там):

#import "Test_Project-Swift.h"

2

Просто хедз-ап для тех, кто использовал "." там имя проекта. 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

Береги себя,

Джон


2

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

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

// # import "ProductModuleName-Swift.h"

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

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


Моя проблема заключалась в том, что у меня тоже были ошибки в моем коде Swift, но я не знал об этом, пока я не раскомментировал файл -Swift.h. Спасибо!
— Будет

1

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

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

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


1

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

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

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

#import "SwiftBridge.h"

вместо ProductModuleName-Swift.h

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


Не работает Только что попробовал. В строке #import “ProductModuleName-Swift.h”появляется ошибка в файле SwiftBridge.h вместо исходного файла кода Objective-C.
— Supertecnoboff

1

Я с трудом определял, как мой модуль / target-c импортирует заголовки swift. Я тоже прочитал много статей здесь.

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

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

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

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


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

1

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


2
Для других - посмотрите в Build Settings для вашей цели, получите точное имя "MyProject-Swift.h" - это то, что вам нужно включить как "#include" MyProject-Swift.h "в соответствующие файлы Objc. Кстати, это Ответ действительно помог мне - работа над преобразованием некоторого более старого открытого источника ObjectiveC
— Дэвид Х

0

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

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


0

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


0

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


0

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


0

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.