Імпорт Project-Swift.h у файл класу Objective-C… файл не знайдено


128

У мене є проект, який був запущений в Objective-C, і я намагаюся імпортувати деякий код Swift в ті ж файли класу, про які раніше писав Objective-C.

Я не радився з Apple , документи по використанню Swift і Objective-C в тому ж проекті, а також SO питання , як це, але до сих пір не допомогло: я по- , як і раніше отримати файл не знайдений помилка після введення в #import "NewTestApp-Swift.h"( NewTestAppце назва продукту і модуль).

Ось що я зробив досі:

  1. У Define Modules, вибраному YESдля додатка.
  2. Переконайтесь, що назва модуля продукту не мала місця в ньому (див. Скріншот нижче питання)

Я спробував з допомогою #import "NewTestApp-Swift.h"всередині ViewController.m, ViewController.hі , AppDelegate.mале жоден з них не працював.

Що ще я роблю неправильно? Спасибі за вашу допомогу.


Знімок екрана налаштувань:

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


Помилки, з якими я зараз стикаюся:

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


3
Видалити всі отримані дані в ~/Library/Developer/Xcode/DerivedDataмені зробив трюк.
wzhang84

Ось як я вирішив питання: stackoverflow.com/a/45338549/8102549
schrulnz

Відповіді:


158

Я зіткнувся з тією ж проблемою, і не міг отримати свій проект імпортувати стрімко в класи obj-c. Використовуючи Xcode 6, (повинен працювати для Xcode 6+) і зміг це зробити таким чином ....

  1. Будь-клас , який вам потрібен доступ в .h файл повинен бути випереджальне оголошення , як це

@class MySwiftClass;

  1. У файлі .m ТОЛЬКО, якщо код знаходиться в одному проекті (модулі), вам потрібно імпортувати його

#import "ProductModuleName-Swift.h"

Посилання на яблучну документацію про це

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
Дякую за відповідь. Це привело мене в правильне русло. У мене була та сама проблема, але з протоколом, тому мені довелося додати @protocol MySwiftProtocol замість імпорту у мій файл заголовка.
пальма

в .h файл переадресація декларування класу без імпорту .h файл зробив для мене трюк. Спасибі
Сікандер

1
Зауважте, що якщо в назві вашого продукту є -символ, ім'я згенерованого файлу заголовка буде перетворене в це _. наприклад, якщо назва вашого продукту My-App, ви імпортуєте My_App-Swift.h.
дваноні

1
Я знайшов новий спосіб знайти правильне створене ім'я файлу заголовка: перейдіть до своєї цілі -> Налаштування збірки -> Ключові слова пошукуObjective-C Generated Interface Header Name , бінго!
Ітачі

2
Я зробив обидві ці речі, і все ще бачу ту саму проблему. Як ви вважаєте, це пов’язане з замовленням?
ArielSD

83

Якщо код Swift знаходиться у модулі (як у вашому випадку):

#import <ProductName/ProductModuleName-Swift.h>

Якщо код Swift знаходиться в проекті (змішаний Swift та ObjC):

#import <ProductModuleName-Swift.h>

У вашому випадку вам потрібно додати цей рядок у файл * .m:

#import <NewTestApp/NewTestApp-Swift.h>

ВАЖЛИВО: подивіться на "<" у заяві про імпорт

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


Дякуємо за відповідь @ ikocel1. На жаль, це не спрацювало. Я пробував варіанти <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>і <NewTestApp/ViewController-Swift.h>все всередині ViewController.m, але по- , як і раніше , щоб отримати «файл не знайдено» помилка, незважаючи на Cleaningпроект кожного разу після того, як спробувати комбінацію. Я включив скріншот у тіло питання, якщо це допомагає.
даспіаніст

Я ще не ввів жодного коду Swift ViewController.m. Я лише намагаюся імпортувати заголовки спочатку, щоб спробувати змусити його прийняти код Swift. Я буду змішувати і відповідати як Objective-C, так і Swift коду в ViewController.m.
даспіаніст

1
Я не знаю, чи можливо безпосередньо змішувати код objc і швидкий код в одному файлі.
ikocel1

1
Дякую, я гадаю, це було припущення, що я базувався на документі Apple "Mix and Match" Apple, але, мабуть, не всередині фактичного файлу. Дякую!
даспіаніст

6
Я не отримав, чому ця відповідь була схвалена. Так, це правильно, слідкуючи за документацією, але практично не працює і для мене. Навіть у питанні очевидно, що користувач використовує синтаксис, як рекомендується у цій відповіді, але все ж отримує помилку.
Дарій Міліаускас

54

Як мені вдалося імпортувати швидкий у target-c:

  • Визначає модуль, встановлений на ТАК (для проекту - не для цілі)
  • Набір назви модуля продукту (цільовий - не для проекту)
  • У ваш ViewController.m імпортуйте швидкий код за допомогою:

    #import "MyProductModuleName-Swift.h"
  • Додайте швидкий файл до проекту target-c (Файл -> Новий -> Швидкий), і Xcode створить перемикаючий заголовок від target-c до Swift, але це має вирішальне значення для того, щоб він також працював навпаки - мабуть.

Останній фрагмент цієї головоломки дякує Swiftoverload за те, що я зрозумів, що фактично додаю файл Swift через графічний інтерфейс Xcode, а не просто перетягувати існуючі swift-файли в мій проект, щоб він працював: http://nikolakirev.com/blog / using-swift-in-target-c-project


Відмінні ноти. Я додам, що тестова ціль є власним модулем і матиме власний заголовок під назвою "<#TestTargetName #> - Swift.h", і що будь-які пробіли в іменах цілі будуть перетворені на пробіли.
Чак Крутсінгер

@ holm51 пробачте про це запитати, але де це Define Moduleі Product Module Name?
matchifang

дефіс -в імені будуть перетворені в символи підкреслення , _а також
CyberMew

11

Використовуючи Xcode 8.2.1, і якщо ви подивитесь на Project > Settings settings> Назва об'єкту-згенерованого об'єктива-C , там він відображає лише один файл заголовка з назвою Product -Swift.h

Це означає, що замість імпорту кожного модуля окремо від файлу .m. Objective-C, використовуючи окремий файл -Swift.h, ви просто імпортуєте один продукт -Swift.h, який агрегував усі модулі Swift.

Я зіткнувся з тією ж проблемою, шукаючи традиційний спосіб імпорту модулів окремо, але поточна версія Xcode та Swift 3 змінила його на використання лише одного заголовка для всього імпорту модуля.


привіт, Петре, де ти можеш знайти цей файл? Або він автоматично генерується за допомогою xcode? Крім того, чи вам доведеться іншим чином налаштовувати свій підфайл через цю зміну?
Роб Норбак

@RobNorback Якщо я не помиляюся, ви можете просто написати "імпорт" Product-Swift.h "у файл заголовка / впровадження Obj-C, щоб побачити ефект, не роблячи нічого зайвого. Переконайтеся, що в налаштуваннях проекту включена кожна конфігурація для змішування Swift та Obj-C. Крім того, у мене ще не виникло проблем з Podfile. Будь ласка, дайте мені знати, якщо я бачу речі по-іншому.
petershine

Дякую, я витратив години на те, щоб налагодити це, і проблема справді полягала в тому, що кожен з модулів мого проекту генерував власний -Swift.hфайл заголовка. Змусивши їх усіх (у мене 5 цілей) використовувати загальний файл заголовка, який вирішив для мене проблему.
Апоорв Хатреджа

@ApoorvKhatreja як ти змусив їх це зробити? Ім'я файлу явно написано?
Аміт Раз

8

Витратили годину на це питання, дотримуючись цих кроків, ви допоможете зрозуміти, чого не вистачає:

  1. Відкрийте налаштування Xcode та перейдіть до папки DerivedData
  2. Шукайте "swift.h" у пошуку
  3. Якщо ви не можете знайти жодного файлу project-swift.h, цей файл не створено. Зазвичай вам потрібно додати @objc до одного зі своїх швидких класів та успішно скласти додаток, лише тоді Xcode створить цей файл
  4. Якщо ви знайшли файл "xxx-swift.h", переконайтеся, що у заяві про імпорт міститься правильна назва.

як знайти-swift-файл


Не додайте однакову відповідь на кілька запитань . Дайте відповідь найкращому та позначте решта як дублікати, як тільки ви заробите достатню репутацію. Якщо це не дублікат, пристосуйте публікацію до питання та позначте його на невизначення.
Bhargav Rao

Дякую за це! Я змінив ім'я відображення програми (не цілі), а ім'я Swift також змінило ім'я. Це єдиний спосіб я міг знайти те, що відбувається.
Лукас П.

Дякуємо, що опублікували відповідь. Знімки екрана та точна форма одразу змушують мене прокручуватися назад + подивився + закінчився пошук ... проблема вирішена!
dklt

6

У мене виникли проблеми з імпортом Swift у проект Objective-C. Врешті-решт я заглянув у папку Derivied Data, щоб перевірити, що генерує Xcode 7. Ім'я файлу було зовсім іншим, ніж те, що я очікував.

Після того, як у мене було фактичне ім'я файлу, я імпортував це, і проект міг створити.


2
Де знаходиться цей файл? Я озирнувся там і нічого не зміг знайти
Аміт Раз

5

-Swift.hповинен створюватися Xcode автоматично, якщо Swift код відкриває API через @objcабо @objcMembers[About]

Зазвичай розташування виглядає так

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Це можна змінити

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

За замовчуванням це значення $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

ВИЗНАЧИТИ МОДУЛИ: ТАК та імпортувати "ProjectName-Swift.h" у .m файл класу Obj-C

Це працювало для мене, щоб отримати доступ до класів Swift в Obj-c.


3
Але як імпортувати його в .h файл, якщо мені потрібен швидкий клас у заголовку objc?
Олександр Данилов

1

Я зіткнувся з тією ж проблемою і з моєю командою, коли працював над проектом за допомогою git. Один розробник не оновив Xcode до останньої версії (7.3), яка була потрібна для останньої версії Swift 2.2. Отже, компілятор не розпізнав новий синтаксис Swift і не зміг генерувати інтерфейс для бібліотеки Swift (projectname-swift.h). Перевірте, чи найновіша версія Xcode!


У моєму випадку я зіткнувся з проблемою, оскільки вирішив перенести міграцію на Swift 3, запропоновану компанією Xcode. В результаті Xcode не зміг створити вихідні файли Swift і не створив заголовки для включення.
iutinvg

1

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

Переконайтеся, що у файлах swift немає синтаксичних помилок, а потім спробуйте імпортувати заголовок swift у файл target - c


1

Імпорт файлу заголовка, тобто

#import "<ProjectName>-Swift.h" 

у файлі .h створено помилку, вказавши:

Файл -Swift.h 'не знайдено

і збірка не вдалася.

Замість цього використовуйте:

#import "<ProjectName>-Swift.h"

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

Класи swift доступні у файлі .m.


1

Я зіткнувся з проблемою з назвою проекту (цілі). Він містив символ "-". Тож рішення було наступним: якщо назва проекту "Test-App", то імпортний клас "Test_App-Swift.h"


чудове рішення
iOS Lifee

1

Якщо у вашому імені програми є якийсь спеціальний символ, тоді використовуйте _ для спеціального символу.

Наприклад, якщо ваше ім'я програми - Ім'я "Test App®"

Тоді ви можете імпортувати швидкий файл за допомогою "Test_App_-Swift.h".

Пробіл і ® замінюються на _ під час імпорту.


0

Якщо у вас кілька цілей, переконайтеся, що ви створили всі рамки


0

Xcode 11

Я зіткнувся з цією проблемою, будуючи Xcode 11. Взяв мене трохи, щоб зрозуміти, що не так, але по суті, я змінив налаштування "Відображати ім'я" на вкладці "Загальні", а не змінювати безпосередньо в Info.plist файлі через Вкладка "Інформація" на Цілі.

Це призвело до того, що Xcode 11.5 пройшов перезапис / створення безлічі абсолютно нових налаштувань збірки та зміни назви модуля програми та вбудованого продукту .app. У цьому випадку нове ім'я дисплей також мав прямий слеш ( /) символ в ній , які можуть в кінцевому рахунку, саме тому він не будує (див @Silversky Technology «s відповідь ).

Незважаючи на це, я вирішив це, скасувавши всі автоматичні зміни файлу проекту Xcode 11.5 і вручну внісши ті ж зміни в ім'я відображення пакета у Info.plistфайлі, і все працює чудово.

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


0

Переконайтеся, що ваш клас swift має публічну декларацію та розширює NSObject:

public class MySwiftClass: NSObject {
    //...
}

Імпорт повинен працювати з лапками, а не з дужками, якщо клас швидкого класу є в одному проекті.


0

якщо ви додасте файл Swift спочатку, пам’ятайте, щоб додати швидкий файл до своєї цілі…, у лівій колонці

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