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

130

У меня есть проект, который был начат в 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но ни один из них не работал.

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


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

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


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

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

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

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

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

bolnad
источник
3
Спасибо за ответ. Это привело меня в правильное русло. У меня была такая же проблема, но с протоколом, поэтому мне пришлось добавить @protocol MySwiftProtocol вместо импорта в моем файле заголовка.
palme
в файле .h прямое объявление класса без импорта файла .h помогло мне. Спасибо
Sikander
1
Обратите внимание: если в названии вашего продукта есть -символ, то имя сгенерированного файла заголовка будет преобразовано в _. например, если название вашего продукта My-App, вы должны импортировать My_App-Swift.h.
dvanoni 08
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
источник
Спасибо, что ответили на @ ikocel1. К сожалению, это не сработало. Я пробовал варианты <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>и <NewTestApp/ViewController-Swift.h>все внутри ViewController.m, но продолжаю получать ошибку «файл не найден», несмотря Cleaningна проект каждый раз после попытки комбинации. Я включил снимок экрана в текст вопроса на случай, если это поможет.
daspianist
Я еще не ввел код Swift ViewController.m. Я только пытался сначала импортировать заголовки, чтобы попытаться заставить его принять код Swift. Я буду смешивать и сопоставлять код Objective-C и Swift в ViewController.m.
daspianist
1
Я не знаю, можно ли напрямую смешивать код objc и быстрый код в одном файле.
ikocel1
1
Спасибо, я предполагаю, что это было предположение, которое я сделал на основе документа Apple "Mix and Match" ... но я думаю, что не внутри самого файла. Спасибо!
daspianist
6
Я не понял, почему этот ответ был одобрен. Да, это правильно, следуя документации, но и у меня практически не работает. Даже в вопросе очевидно, что пользователь использует синтаксис, рекомендованный в этом ответе, но все равно получает ошибку.
Дариус Миляускас
54

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

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

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

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

holm50
источник
Отличные заметки. Я бы добавил, что тестовая цель - это отдельный модуль и будет иметь собственный заголовок с именем «<#TestTargetName #> - Swift.h» и что любые пробелы в целевых именах будут преобразованы в пробелы.
Chuck Krutsinger
@ holm51 извините за этот вопрос, но где находится Define Moduleи Product Module Name?
matchifang
дефис -в имени будут преобразованы в символы подчеркивания , _а также
CyberMew
11

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

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

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

petershine
источник
привет Питер, где ты можешь найти этот файл? Или это автоматически создается xcode? Кроме того, вам нужно настроить свой подфайл по-другому из-за этого изменения?
Роб Норбак
@RobNorback Если я не ошибаюсь, вы можете просто написать import "Product-Swift.h" в файле заголовка / реализации Obj-C, чтобы увидеть эффект, не делая ничего лишнего. Убедитесь, что в настройках вашего проекта включены все конфигурации для смешивания Swift и Obj-C. Кроме того, у меня до сих пор не было проблем с Podfile. Пожалуйста, дайте мне знать, если я смотрю на вещи по-другому.
petershine 01
Спасибо, я потратил часы, пытаясь отладить это, и действительно проблема заключалась в том, что каждый из модулей в моем проекте генерировал свой собственный -Swift.hфайл заголовка. Принуждение их всех (у меня есть 5 целей) к использованию общего файла заголовка устранило проблему для меня.
Apoorv Khatreja
@ApoorvKhatreja, как ты заставил их это сделать? Написали имя файла явно?
Amit Raz
8

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

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

как к найти-Свифт-файл

Jakehao
источник
Пожалуйста, не добавляйте один и тот же ответ на несколько вопросов . Ответьте на лучший вариант, а остальные отметьте как дубликаты, как только заработаете достаточно репутации. Если это не дубликат, адаптируйте сообщение к вопросу и отметьте его для отмены удаления.
Бхаргав Рао
Спасибо тебе за это! Я изменил имя своего приложения (а не цель), и заголовок 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)

yoAlex5
источник
2

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

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

Вентилятор YSR
источник
3
Но как импортировать его в файл .h, если мне нужен быстрый класс в заголовке objc?
Александр Данилов
1

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

Артем Логинов
источник
В моем случае я столкнулся с проблемой, потому что решил отложить переход на Swift 3, предлагаемый Xcode. В результате Xcode не мог создавать исходные файлы Swift и не генерировал заголовки для включения.
iutinvg
1

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

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

Гурунатх Шрипад
источник
1

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

#import "<ProjectName>-Swift.h" 

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

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

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

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

#import "<ProjectName>-Swift.h"

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

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

Claytog
источник
1

У меня возникла проблема с названием проекта (цели). В нем есть символ «-». Итак, решение было следующее: если имя проекта - «Test-App», то имя импортированного класса - «Test_App-Swift.h».

opochtovy
источник
превосходное решение
iOS Lifee
1

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

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

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

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

Silversky Technology
источник
0

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

Same7Farouk
источник
0

Xcode 11

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

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

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

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

Beltalowda
источник
0

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

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

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

Майкл Риббонс
источник
0

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

JethroYe
источник