myProjectName-Swift.h не найден после чистой сборки

Потратил много времени на поиск решения в Google и SO, но безуспешно. Очень надеюсь, что кто-то может указать, в чем может быть проблема.

Итак, у меня есть проект objc+swift. У меня есть файл Bridging Header с imports файлами заголовков Objc, которые мне нужно использовать в Swift.

Чтобы объяснить проблему, я поделюсь двумя сценариями. В 1-м сценарии все работает нормально. Во 2 выдает ошибку.

Обратите внимание: оба сценария имеют одинаковую кодовую базу.

Сценарий 1. Не работает, выдает ошибку.

  1. Открываю проект.
  2. Жесткий Очистите его.
  3. Строить
  4. Показывает ошибку: 'myProjectName-Swift.h' file not found
  5. Он также показывает такую ​​​​ошибку:

не удалось создать предварительно скомпилированный заголовок '/Users/tungfam/Library/Developer/Xcode/DerivedData/myProjectName-ctxxkwqtckhvyoawavmuzmdxqaml/Build/Intermediates.noindex/PrecompiledHeaders/myProjectName-Bridging-Header-swift_1UP5PCPCLBPHP-clang_18PVO5108TD8S.pch' для заголовка/Userssbridging tungfam/Developer/myProjectName/myProjectName/App/myProjectName-Bridging-Header.h'

Сценарий 2. Как заставить это работать.

  1. Я беру тот же код из Сценария 1.
  2. Жесткая очистка
  3. Прокомментируйте imports в файле Bridging Header
  4. Прокомментируйте код Swift, в котором я использовал файлы Obc (которые были объявлены в заголовке моста, который я только что прокомментировал на предыдущем шаге)
  5. Я строю проект. Это удается.
  6. Поскольку некоторые части в приложении сломаны, потому что я прокомментировал материал. Я раскомментировал файл imports в файле Bridging Header и код Swift, где я использовал классы Objc.
  7. Запускаем еще раз (без жесткой очистки) и все работает.

Буду очень признателен за любую помощь в этом вопросе. Пожалуйста, поделитесь всем, что, по вашему мнению, может помочь решить эту проблему.

Я использую Xcode 10.0; Свифт 4.2

UPDATE1: я думаю, что это должно что-то делать со второй ошибкой, которую я указал выше. Возможно, он не может создать этот файл моста.

UPDATE2: Я прочитал что-то вроде: "Если вы импортируете файл Objc с именем ABC в Bridging Header. И если этот ABC импортирует в себя файл myProjectName-Swift.h. Тогда в этом случае могут быть некоторые проблемы. Как вы думаете, это может быть правдой?


person Tung Fam    schedule 19.10.2018    source источник
comment
Да, я думаю, что ваше второе обновление является причиной проблемы.   -  person dosi    schedule 19.10.2018


Ответы (2)


Вы не должны использовать #import "ProjectName-Swift.h" в файлах заголовков.

Если вам нужны классы или протоколы Swift в коде Obj-C, вы можете предварительно объявить их в соответствующем заголовке Obj-C. Вот дополнительная информация об этом:

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

// MyObjcClass.h
@class MySwiftClass;
@protocol MySwiftProtocol;

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end

Кроме того, обратите внимание, что у вас могут возникнуть проблемы с импортом Swift Enums, протоколов и классов в ObjC, поэтому вам может потребоваться явно определить элементы, которые вы хотите сделать доступными для кода ObjC, с помощью ключевого слова @objc.

И вы не сможете использовать структуры Swift в Obj-C.

person dosi    schedule 19.10.2018

От Swift до Objective C вам просто нужно использовать #import "ProjectName-Swift.h" в ваших классах Objective C, которым требуется доступ к коду Swift. Нет необходимости добавлять файл заголовка моста. Для другого пути Objective C к Swift вам нужно объявить в заголовочном файле моста.

person Ramon Vasconcelos    schedule 19.10.2018
comment
Спасибо за ответ! Да, я понимаю. Я использую соединительный заголовок только для размещения файлов Obj-C, которые я хочу использовать в Swift. Но обратите внимание (обновление 2), эти файлы Obj-C также импортируют ProjName-Swift.h внутри себя. Итак, я думаю, что есть связанная зависимость, где файлу objc нужен swift, а swift нужен objc. Я думаю проблема кроется там. - person Tung Fam; 19.10.2018
comment
В этом случае, возможно, вы дважды импортируете заголовки, вы можете взглянуть на этот ответ stackoverflow.com/a/26216852/4816590, чтобы избежать дублирования импорта. - person Ramon Vasconcelos; 19.10.2018