Импорт Project-Swift.h в класс Objective-C... файл не найден

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

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

Вот что я сделал до сих пор:

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

Я пытался использовать #import "NewTestApp-Swift.h" внутри ViewController.m, ViewController.h а также AppDelegate.m но ни один из них не сработал.

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


Скриншот настроек:


Ошибки, с которыми я сейчас сталкиваюсь:

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

21 ответ

Решение

Я столкнулся с той же проблемой и не смог заставить мой проект быстро импортировать в классы obj-c. Используя Xcode 6, (должен работать для Xcode 6+) и смог сделать это таким образом....

  1. Любой класс, к которому вам нужно получить доступ в файле.h, должен иметь такое предварительное объявление

@class MySwiftClass;

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

#import "ProductModuleName-Swift.h

Ссылка на яблочную документацию об этом

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

Если код 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

Как мне удалось импортировать swift в target-c:

  • Определяет модуль, установленный на YES (на проекте - не на цели)
  • Наименование модуля продукта установлено (на цели - не на проекте)
  • В вашем ViewController.m импортируйте код swift с помощью:

    #import "MyProductModuleName-Swift.h"
    
  • Добавьте файл swift в ваш проект target-c (File -> New -> Swift), и Xcode создаст соединительный заголовок из target-c в Swift, но это крайне важно для того, чтобы заставить его работать и наоборот - очевидно.

За последний фрагмент этой головоломки спасибо Swiftoverload за то, что он сообщил мне о фактическом добавлении файла Swift через графический интерфейс Xcode, а не просто перетаскивании существующих swift-файлов в мой проект, чтобы заставить его работать: http://nikolakirev.com/blog/using-swift-in-objective-c-project

Используя Xcode 8.2.1 и если вы посмотрите на Проект > Настройки сборки> Имя заголовка сгенерированного интерфейса Objective-C, там он покажет только один заголовочный файл, названный как Product -Swift.h

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

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

Потратил час на решение этой проблемы, выполнив следующие действия, чтобы понять, чего не хватает:

  1. Откройте настройки XCode и перейдите в папку DerivedData.
  2. Искать "swift.h" в поиске
  3. Если вы не можете найти файл project-swift.h, этот файл не был создан. Обычно вам нужно добавить @objc в один из ваших swift-классов и успешно собрать приложение, только тогда Xcode сгенерирует этот файл
  4. Если вы нашли файл "xxx-swift.h", убедитесь, что ваш оператор импорта содержит правильное имя.

-Swift.h должен создаваться Xcode автоматически, если код Swift предоставляет API через @objc или @objcMembers [Около]

Обычно локация выглядит как

~/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)

У меня были проблемы с импортом Swift в проект Objective-C. В конце я заглянул в папку "Производные данные", чтобы проверить, что генерирует Xcode 7. Имя файла полностью отличалось от того, которое я ожидал.

Как только у меня появилось реальное имя файла, я импортировал его, и проект можно было построить.

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

Например, если ваше приложение называется "Test App®"

Затем вы можете импортировать быстрый файл с помощью "Test_App_-Swift.h".

Пробел и ® заменяются на _ во время импорта.

Убедитесь, что ваш быстрый класс имеет публичное объявление и расширяет NSObject:

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

Импорт должен работать с кавычками, а не скобками, если класс swift находится в том же проекте.

Импорт файла заголовка, т.е.

#import "<ProjectName>-Swift.h" 

в.h файле сгенерировал ошибку, заявив:

-Swift.h 'файл не найден

и сборка не удалась.

Вместо этого используйте:

#import "<ProjectName>-Swift.h"

в файле.m, и, несмотря на то, что появляется та же ошибка, запуск проекта в любом случае подавляет ошибку.

Затем классы swift доступны в файле.m.

ОПРЕДЕЛИТЬ МОДУЛИ: ДА и импортировать "ProjectName-Swift.h" в файл.m класса Obj-C

Это помогло мне получить доступ к классам Swift в Obj-c.

Если вы сначала добавите Swift File, не забудьте добавить быстрый файл к вашей цели... в левом столбце

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

Я столкнулся с проблемой с названием проекта (target). В него включен символ "-". Поэтому решение было следующим: если имя проекта "Test-App", то имя импортируемого класса - "Test_App-Swift.h".

Я столкнулся с этой проблемой после дублирования существующей цели. Когда я попытался построить с дублированной целью, появляется ошибка « Файл ProductName-Swift.h не найден ».

После просмотра настроек сборки в новой цели я обнаружил, что значение параметра « Имя продукта » каким-то образом установлено таким же, как имя цели. После установки правильного, ошибка исчезла.

У меня была такая же проблема с #import "myProj-Swift.h" not found, Xcode 12.3, год 2021.

Похоже, что до тех пор, пока не был сгенерирован мостовой заголовок, невозможно импортировать myProj-Swift.h.

Мое (воспроизводимое) решение, когда нужно добавить Swift в проекты Objective-C, состоит в том, чтобы создать (Файл - Новый файл - Файл Swift) фиктивный пустой файл Swift в моем проекте. Затем Xcode спрашивает, создавать ли заголовок моста, на что я отвечаю да. В результате в мой проект будет добавлен файл «myProj-Bridging-Header.h», который отображается в навигаторе проекта.

Как только это будет сделано, ошибка #import "myProj-Swift.h" исчезнет.

После этого я могу удалить фиктивный файл и вставить в проект необходимые классы Swift.

Логика создания видимого связующего заголовка, но оставление -Swift.h полностью невидимым, полностью ускользает от меня. Не обращайте внимания на проблему попыток узнать об этом в официальной документации « Импорт Swift в Objective-C» , в которой (на мой взгляд, неточно) говорится: «Вам не нужно делать ничего особенного для создания сгенерированного заголовка».

Вероятно, неплохо было бы также принять во внимание ответ @Sandeep Bhandari на этот вопрос - кто говорит, что файл -Swift.h будет сгенерирован только в случае успешной компиляции проекта.

Дополнительная информация также в этом и этом вопросе.

Если название вашего продукта TestApp-Dev, то имя файла будет TestApp_Dev-Swift.h.

Вы можете проверить это, перейдя по следующему адресу ~/Library/Developer/Xcode/DerivedData//Build/Intermediates.noindex/yourProjectbuild/Debug-iphonesimulator/MashreqMobileApp.build/DerivedSources.

Если вы хотите, чтобы у каждой схемы сборки было одинаковое имя файла, перейдите в «Настройки сборки», чтобы они были одинаковыми для всех ваших модулей/схем. (установите $(PROJECT_NAME)-Swift.h).

Если имя проекта — TestApp, то сгенерированный файл будет TestApp-Swift.h и останется одинаковым для всех схем.

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

Убедитесь, что в файлах swift нет синтаксических ошибок, а затем попытайтесь импортировать заголовок swift в файл target - c.

Xcode 11

Я столкнулся с этой проблемой при создании Xcode 11. Мне потребовалось немного времени, чтобы понять, что было не так, но по сути, я изменил параметр "Отображаемое имя" на вкладке "Общие" цели вместо изменения непосредственно в Info.plist файл через вкладку "Информация" в Target.

Это привело к тому, что Xcode 11.5 переписал / создал кучу совершенно новых пользовательских настроек сборки и изменил имя модуля приложения и созданного продукта.app. В этом случае новое отображаемое имя также имело косую черту (/) Характер, в ней, которые могут в конечном счете, именно поэтому он не строит (см Jignesh Mayani"s ответ).

Как бы то ни было, я решил эту проблему, отменив все автоматические изменения Xcode 11.5 в файле проекта и вручную внося такие же изменения в отображаемое имя пакета в Info.plist файл и все работает отлично.

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

Если у вас несколько целей, убедитесь, что вы собрали все фреймворки.

Целевой исполняемый файл не зависел от моей (или любой другой) инфраструктуры.

Фазы сборки -> Зависимости должны указывать зависимости цели, чтобы избежать периодических ошибок: в моем случае отладочная сборка прошла нормально, а автоматические сборки Jenkins CI терпели неудачу. Кошмар для отладки, учитывая, что вывод Jenkins производит объемный мусор, который требует огромного времени, чтобы пройти через него.

Другие вопросы по тегам