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

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

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

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

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

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

Что еще я делаю неправильно? Благодарим за помощь.


Снимок экрана настроек:

enter image description here


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

enter image description here

Ответ 1

Я столкнулся с той же проблемой и не смог заставить мой проект быстро импортировать в классы 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#//apple_ref/doc/uid/TP40014216-CH10-XID_87

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

how-to-locate-swift-file

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

#import "<ProjectName>-Swift.h" 

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

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

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

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

#import "<ProjectName>-Swift.h"

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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