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


242

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

Додавши вихідний файл Swift до проекту, у мене немає проблем з отриманням "Бридж-заголовка", тобто Objective-C Swift.

Але *-Swift.hфайлу заголовка, який повинен піддавати класам Swift або позначені @objcабо підкласи класів ObjC, ніде не знайдено :-(

Я не бачу жодних конкретних вказівок, як домогтися використання мого нового підкласу, написаного в Swift, в моєму головному коді додатка (який все ще є «Objective-C»).

Додаток, яким я є провідним розробником, має досить велику базу коду (70 000 рядків), тому перехід його за один раз не підлягає сумніву.


5
Так. Це дійсно запитує, де в XCode IDE вам потрібно щось зробити, щоб цей Swift-> ObjC очолив створений, оскільки це не відбувається "за замовчуванням" при додаванні коду Swift до існуючого проекту ObjC.
Девід Крістенсен

5
@Popeye Я не згоден. У цьому випадку, якби ви редагували файли та компілювали з командного рядка, ви б не бачили цієї проблеми. Ідеї, які виконують (або повинні виконувати) від вашого імені, є спірними. Це, швидше за все, пов’язано з налаштуванням проекту, що, безумовно, є функцією 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
На всякий випадок, коли інші настільки ж розгублені, як і я ... Мені довелося мати щастя тут і просто імпортувати заголовок, оскільки він не заповниться автоматично.
shawnwall

14
Ви не можете імпортувати -swift у файли заголовків (.h) лише в ході реалізації.
zirinisp

122

У мене була подібна проблема і виявив, що ти можеш лише додати

#import "ProductModuleName-Swift.h"

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


2
Це правильно, і ... що робити, якщо мені потрібно використовувати клас Swift у заголовку objc? Я спробував заздалегідь оголосити, він також не працює.
Ixx

2
Whops, вибачте, передача декларацій працює. Я забув додати крапку з комою: 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та Bingo! Заголовок створено та імпортується правильно :)


Дякую, це саме те, що мене стримувало. Після виправлення помилок швидкої збірки мені було добре піти. (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
Якщо назва вашого модуля проекту містить дефіси, їх також слід замінити на підкреслення. Тож якщо назва вашого проекту "Мій проект", використовуйте #import "My_Project.h"
Джефф Еймс

6
Крім того, якщо назва вашого модуля проекту починається з числа, його також слід замінити на підкреслення. "Першим проектом" буде "_st_Project-Swift.h"
Данація

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 та Code Objective-C. Мені не вдалося імпортувати класи Swift поза рамками - я перевірив файл -Swift.h, і він генерувався, але був порожнім.

Проблема виявилася дуже-дуже простою - я не оголосив жодного з моїх класів Swift! Щойно я додав загальнодоступне ключове слово до класів, я зміг їх використовувати з класів всередині та поза рамками.

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

#import <FrameworkName/FrameworkName-Swift.h>

2
У рамках я також зазначаю, що для використання класів Swift вони повинні бути успадковані від NSObject (навіть @objc не допоможе), а всі методи / властивості повинні бути відкритими.
dmitrynikolaev

3
Принаймні в поточному попередньому випуску XCode 7, поки ви не успадкуєте від NSObject, вони не будуть доступні у створеному швидкому заголовку.
dmitrynikolaev

На 100% НЕ виправили мою проблему. КОЖНЕ рішення - "оприлюднити свої заняття". Я зробив це. Період. Він все ще НЕ розкриває класи Swift в проектах, що використовують рамки.
datWooWoo

@lespommes, ви повинні написати запитання і поставити зразок проекту десь із проблемою, хтось може зрозуміти, що відбувається ... Я просто дав свою відповідь як одне можливе рішення, тому що саме помилка видимості я роблю більшість часто.
Кендалл Гельмстеттер Гельнер

2
О так, ваш натяк на імпорт нарешті зробив для мене трюк! Дуже дякую!
ендовзонер

14

У мене була така ж проблема. Схоже, вам доведеться відрегулювати налаштування (визначає назву модуля та продукту), перш ніж додавати перший файл Swift.

Якщо ви зробите це згодом, файл "* -Swift.h" не буде генеровано для цього проекту, навіть якщо ви додасте додаткові файли Swift або видалите файл Swift та створите новий.


Я не впевнений, що це правда. Я не вирішив увімкнути "Визначає модуль", поки не створив багато швидких файлів, і мені вдалося отримати -Swift.h просто чудово.
Майкл Петерсон

Мені насправді сумно повідомляти про це саме таку проблему, яку я мав :( мені довелося видалити .swift і повторно додати його, а потім все спрацювало.
StuFF mc

2
А тепер що? Я в середині зміни і Swift, і ObjC-коду. Моя Project-Swift.h не оновлюється. Я навіть намагався видалити файл заголовка.
Suhail Bhat

2
Мені довелося це написати, dev.iachieved.it/iachievedit/?p=980 . Підказка щодо оновлення параметрів збірки перед додаванням файлів Swift була для мене ключовою.
Джо

Це означає, що мені довелося б відтворити проект і знову додати все, якби цього не зробив? Що б я не робив, я не можу отримати файл * -Swift.h, який потрібно створити.
kgreenek

13

Дозвольте мені поділитися своїм досвідом, намагаючись використати Swift у старому проекті objc. У мене не було , щоб встановити Defines moduleвYES .

У моєму випадку мені потрібно було вручну переконатись у тому, що існував об'єктний мостовий заголовок. У моїх налаштуваннях побудови було тільки створене ім'я заголовка інтерфейсу.

Відсутній мост заголовка

Це призводить до створення файлу MyApp-Swift.h, але без слідів моїх класів Swift.

Документація Apple говорить про те, що вам буде запропоновано створити мостовий заголовок під час додавання першого швидкого файлу. Ну, я не був. Я вручну додавMyApp-Bridging-header.h файл і вказав на нього у полі "Об'єктивний заголовок мосту". Це зробило мій файл MyApp-Swift.h заповненим моїми класами Swift.

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


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

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

12

Ось ще одна модифікація модуляName-Swift.h не створюється.

Я вирішив включити IOS Charts у свій проект, але не хотів змішувати джерела в одному каталозі, тому розмістив папку Charts Project поруч із папкою проекту мого коду. Я перетягнув проект "Діаграми" в панель навігації мого проекту і включив рамку до списку " Вбудовані бінарні файли" мого проекту у загальних налаштуваннях проекту та встановив перемикач " Вбудований контент" містить "Код швидкого" на "Так" на вкладці " Налаштування збірки" мого проекту в розділі " Параметри збірки ".

Файл мого модуляName-Swift.h мого проекту ніколи не генерує незалежно від інших запропонованих тут комутаторів чи налаштувань. Нарешті, використовуючи метод Lou Z для пошуку файлів -Swift.h, я побачив, що файл Charts-Swift.h генерується глибоко в каталозі збірки xcode мого проекту в Charts.framework / Headers /

Рішення щодо використання пакету ios-charts Swift Даніеля Гінді без включення коду у вихідний каталог мого проекту було додати:

#import "Charts/Charts-Swift.h"

До модулів, які відображають дані мого проекту.


Чи можна змінити / налаштувати підказку інструменту в діаграмах IOS? якщо так, то ви можете навести один приклад?
Аміт Чаухан

12

Ім'я файлу завжди передує вашому імені цілі . Він називається найменуванням продукту, але практично це цільове ім'я. Тож якщо ви хочете, щоб це було створено для нової цілі, будьте готові очікувати that_target-Swift.hфайлу.

Один із способів вирішити це

  1. Додайте препроцесор для кожної цілі, яка є назвою самої цілі (без пробілів). Вих. 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 або будь-якого.
ctietze

Це не так на багатьох рівнях. По-перше, .pchфайли сильно не рекомендуються . По-друге, ім'я файлу містить ім'я продукту, а НЕ - цільове ім'я. Це може бути збігом обставин, що це те саме, але воно використовувало назву Продукту!
Юліан Онофрей

10

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

Дивіться мою відповідь: https://stackoverflow.com/a/27972946/337392

EDIT: Це пояснюється модифікаторами доступу громадськості та внутрішнього доступу, як я в кінцевому підсумку знайшов пояснення в документах Apple:

За замовчуванням згенерований заголовок містить інтерфейси для оголошень Swift, позначених загальнодоступним модифікатором. Він також містить ті, що позначені внутрішнім модифікатором, якщо у вашої програми є заголовок моста Objective-C.


Так, це справді допомогло. Я цього не знав. Я подумав, що він просто необхідний для використання Obj-C від Swift.
nodepond

Раді допомогти. Я відредагував відповідь, тому що з тих пір я з’ясував причину такої поведінки.
Ешелон

7

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

Щоб отримати доступ до файлів Swift у вашому Objective-C, все, що вам потрібно зробити, - це додати цей виклик у файл Obj-C (у .m / файл реалізації):

#import "{product_module_name}-Swift.h"

(Де {product_module_name} позначає назву модуля продукту вашого проекту). Замість того, щоб намагатися відгадати назву модуля продукту або розібрати кутові регістри з пробілами та спеціальними символами, просто перейдіть на вкладку параметрів збірки в проекті та введіть "ім'я модуля продукту" - інспектор відкриє вам ваше. Моє було те, чого я не очікував. Перевірте цей знімок екрана, якщо ви плутаєтеся.

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

А для того, щоб код Obj-c працював у Swift, вам просто потрібно додати мостовий файл заголовка та імпортувати туди відповідні заголовки Obj-C.


1
Чи не повинно бути #import?
Юліан Онофрей

Скажімо, моя назва проекту - ABC, тоді "ABC-Swift.h" повинна існувати в моєму проекті, правда? Я не можу його знайти. Чи потрібно створити його вручну? Я не створюю жодних швидких файлів самостійно, лише включаючи какао-стручок, який написано швидко.
nr5

Заголовок мосту (у вашому випадку ABC-Swift.h) не створюється автоматично. Коли ви намагаєтесь створити свій перший файл Swift в проекті Obj-C, Xcode зазвичай пропонує вам додати його. Ви також можете створити заголовок мосту самостійно, як показано тут (control + f для 'bridging header'): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta

5

Найголовніше, що цей файл невидимий !!! Принаймні, це в Xcode6 beta5. У вашому робочому просторі не буде такого файлу з назвою "YourModule-Swift.h". Просто переконайтеся, що у вас є ім'я модуля, і визначте модуль, встановлений на так, і використовуйте його у вашому класі Objective-C.


5

Гаразд, ось усі речі, які вам справді потрібні!

1.Видаліть всі додані швидкі файли та скомпілюйте код без будь-яких помилок.

----------

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

----------

2. Перейдіть до налаштувань збірки "Проекти" та встановіть назву модуля продукту. Проект повинен мати назву продуктового модуля, що не містить пробілів.

----------

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

----------

3. Модуль "Визначення" повинен бути встановлений на "Так" у "Налаштуваннях збірки", під "Упаковка", у вашому проекті, а не націлювати!

----------

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

----------

4. Тепер створіть швидкий файл або контролер перегляду у файлі-> newFile->

----------

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

----------

Він попросить створити мостиковий заголовок, дозволити його зробити. Якщо ви один раз відхилили його, вам доведеться вручну додати -Bridging-Header.h

5.Додайте @objc в контролер, щоб сказати компілятору, що є якийсь швидкий файл, який потрібно піддавати об’єктуC

----------

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

----------

6. Створіть проект та імпортуйте #import "-Swift.h" в будь-який з контролерів targetC, і він буде працювати! Ви можете натиснути на нього командою, щоб побачити фактичний файл!

----------

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

----------

Сподіваюсь, це допомагає!


>> Ви можете натиснути на нього Command, щоб побачити фактичний файл! Це круто
Джаган

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-натисканням на назву класу оператора #import "ProductModuleName-Swift.h"
  8. Видаліть коментар до коду, що посилається на класи Swift, у файл реалізації Objective-C.
  9. Очистити та скласти як звичайне ("ProductModuleName-Swift.h" повинен бути створений, і ваш об'єктивний-C код, що посилається на класи Swift, може використовуватися як звичайний)

Nota Bene: Відповіді про зміну пробілів на підкресленнях та Визначає модуль YES, як зазначено вище, все ще застосовується при виконанні цього процесу, як і правила, визначені в Документації 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 знову створився автоматично.

build-налаштування


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 + натискання на імпорт або генерує його на ходу (і в пам’яті), щоб ви могли бачити, як здійснюється зв'язок, або відкриває файл десь у якомусь кеші Xir dir, але це не в проекті dir.

Потрібно встановити для проекту " Визначає модуль " (у налаштуваннях збірки цілі) значення " Так", а якщо ім'я модуля має пробіли або тире - використовувати _ у всіх імпортах файлу [ProductModuleName] -Swift.h.

Ви можете імпортувати його у всі .h та .m файли, де ви використовуєте швидкі типи, або можете імпортувати їх у .pch.

Отже, якщо мій модуль (проект) названий "Тестовий проект", я імпортував би його у файл .pch мого проекту (саме там):

#import "Test_Project-Swift.h"

2

Просто голова для тих, хто використовував ". там назва назви проекту. Xcode замінить "." з підкресленням "_" для версії мостового файлу заголовка Swift. Як не дивно, що створений Bridging-Header.h не замінює періоди на підкреслення.

Наприклад, проект з назвою My.Project матиме такі назви файлів Bridging Header.

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/DerivedSources

Піклуватися,

Джон


2

Проект повинен мати ім'я модуля, не враховуючи пробілів. Визначає, що модуль повинен бути встановлений на Так у Налаштуваннях збірки, під Упаковка. прокоментував #import заяву:

Якщо ви все ще маєте помилку при імпорті "ProductModuleName-Swift.h", тоді

// # імпорт "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. Команда + 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

Мені важко було визначити ім'я модуля / імпорт цілі-c імпорту заголовків швидкого. Я теж прочитав багато статей тут.

Але остаточну відповідь на назву вашого проекту з усіма включеними спеціальними символами (будь то "." Чи числовим чи пробілом) - текст, який буде працювати для вас, ви можете знайти в " Назва модуля продукту " в розділі Налаштування збірки цілі .

Наприклад, моє цільове ім'я починалося з цифри - "1мг", а вказане вище поле показало "_мг" як моє ім'я модуля.

тому я використав #import "_mg-Swift.h", і він спрацював.

Назва модуля продукту в налаштуваннях збірки цільової дає правильну назву модуля, яка буде працювати для вашого проекту


Якщо ви можете редагувати посилання на скріншот, я можу відредагувати вашу відповідь, щоб відобразити її для вас.
SuperBiasedMan

1

У моєму випадку мені довелося встановити ціль розгортання принаймні на "OS X 10.9", і -Swift.hзаголовок автоматично генерувався. Майте на увазі, що при зміні цільової версії розгортання ви можете отримати багато попереджень про депресію, особливо якщо у вас є старша та дуже велика база коду Objective C. У нашому випадку ми також мали багато роботи над файлами XIB та переглядами класів.


2
Для інших - подивіться у "Налаштування збірки" для своєї цілі, отримайте точну назву "MyProject-Swift.h" - ось що потрібно включити як "#include" MyProject-Swift.h "у відповідні файли Objc. BTW, це відповідь мені справді допомогла - працюю над перетворенням старих відкритих джерел ObjectiveC.
Девід Н

0

Якщо раніше ви могли створити проект, не маючи жодних проблем, пов’язаних з “ProductModuleName-Swift.h” not foundпомилками, а тепер ви отримуєте ці неприємні помилки, причина може бути в останніх змінах.

Для мене це було (випадково) неправильне .swiftкодування файлів. Повернення змін та повернення спинки вручну виконує завдання.


0

Це може бути очевидним моментом (можливо, занадто очевидним), але для створення заголовка у вас повинен бути принаймні один швидкий файл у проекті. Якщо ви пишете коробку або конфігураційний код з наміром швидко записати пізніше, імпорт не працюватиме.


0

Мені довелося видалити швидкий код WatchOS2 зі свого проекту Objective C. І тільки після цього XCode запропонував генерувати -Swift.h


0

У мене була подібна проблема, але мій проект збирався раніше і раптом сталася помилка після кількох змін коду файлів. Мені знадобилось зрозуміти, чому я отримую помилку "Файл не знайдено" для файлу myproject-swift.h. Зміни коду, які я зробив, мали деякі помилки. Xcode не вказав цю помилку, а весь час показував "Файл не знайдено". Потім отримав копію коду попередньої версії, і я порівняв новий код і об'єднав файл по одному. Після кожного злиття файлів виконували проект, щоб знайти помилку. Отже, підсумок - якщо у вас є помилка в коді, Xcode може просто відображати "файл не знайдено помилку" для файлу myproject-swift.h. Швидше за все, у вашому проекті є помилка компіляції. Очистіть цю помилку, і вона спрацює.


0

Якщо ви використовуєте щось на зразок Cocoapods (і розробляєте робочу область, а не проект), спробуйте відкрити проект і створити його перед відкриттям робочої області та будівлі. YMMV.


0

Іноді потрібно просто зняти і знову встановити цільове членство у файлі obj-c .m.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.