Перейдите к заголовку 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и бинго! Заголовок был создан и импортирован правильно :)

petehare
источник
Спасибо, это именно то, что удерживало меня. После исправления ошибок быстрой сборки мне было хорошо идти. (Версия 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"

JohnMorrison
источник
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 и создадите новый.

user3540830
источник
Я не уверен, что это правда. Я не решил включить «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"

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

gjpc
источник
Можно ли изменить / настроить подсказку в диаграммах 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.

user412759
источник
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

Береги себя,

Джон

jonthornham
источник
2

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

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

// # import "ProductModuleName-Swift.h"

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

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

j.krissa
источник
Моя проблема заключалась в том, что у меня тоже были ошибки в моем коде 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 и очищайте код) каждый раз, когда вы получаете эту ошибку, чтобы заставить ее замолчать.

yannisalexiou
источник
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", и это сработало.

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

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

Warpling
источник
0

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

valeCocoa
источник