Я пытаюсь работать с смешанным проектом Swift и ObjectiveC без везения.
Мой проект состоит из 6 целей:
- приложения
- Core
- CoreTest
- Резюме
- Расширение WatchKit
- Приложение WatchKit
Мне удалось добавить класс Swift, в котором есть одно целевое членство (приложение), и использует код ObjectiveC, передаваемый из App-Bridging-Header.h Парадигма "ObjectiveC in Swift code" работает как шарм.
Вместо этого я борюсь с парадигмой "Swift into ObjectiveC". В конкретном случае мне нужно использовать новый класс Swift внутри файла ObjectiveC.m, который является членом четырех целей.
То, что я делал до сих пор, следующее:
- Добавить новый файл Swift в проект Core, определяющий четыре членства (App, Core, Summary, WatchKit Ext)
- XCode просит создать -Bridging-Header.h для трех проектов: Core, Summary и WatchKit Ext (App-Bridging-Header.h уже существует, поскольку он использовался ранее), и я соглашаюсь ( не знаю, почему он создает эти файлы внутри той же групповой папки, где я добавляю свой класс Swift, но не думаю)
- Я создаю класс Swift, добавляя ключ @objc до класса
- Я иду, проверяем, установлено ли Objective-C Имя заголовка сгенерированного интерфейса для всех модулей, и да, это
- Я хочу проверить, установлен ли Определяет модуль Нет во всех модулях и установлен в Да в основном проекте, и да, это
- Я записываю импорт для файлов -Swift.h для всех четырех целей
- В моем классе Objective-C я пытаюсь использовать мой новый класс Swift, видимо, он работает (даже автозаполнение)
- Я пытаюсь создать проект, но он не говорит о том, что файл -Swift.h не найден.
Я следил за Mix and Match guide от Apple и многими SO-потоками, включая этот, по-видимому, по-видимому, для решения той же самой проблемы, но она не работает.
Также видели этот и этот, но не работали.
Попробовали также удалить Derived Data, а также очистить весь проект несколько раз без везения.
РЕДАКТИРОВАТЬ 1: Подробнее
Это объявление моего класса Swift import RealmSwift
@objc class MyClass: Object {}
Это фрагмент использования класса Swift внутри ObjectiveC
MyClass *app = [[MyClass alloc] init];
Если я избегу использовать #import...- Swift.h, сборка не позволяет сказать, что я использую Undeclared idenfier "MyClass", и это звучит.
Если я использую файлы #import...- Swift.h, он говорит, что модуль X не может найти модуль Y и т.д.
EDIT 2: имя модуля Swift
Изучая свойство SWIFT_OBJC_INTERFACE_HEADER_NAME для каждой цели, я видел, что он построен с использованием этого синтаксиса $(SWIFT_MODULE_NAME) -Swift.h мне нужно изменить SWIFT_MODULE_NAME - MODULE_NAME?
РЕДАКТИРОВАТЬ 3: Импорт
Это набор импорта для заголовков Swift в файле .m ObjectiveC. Я использую имена модулей, указанные в относительных свойствах свойств сборки. Обратите внимание, что у человека есть символ "_", так как у цели WatchKit Extension есть пробел в целевом имени.
#import "ProjectName_App-Swift.h"
#import "ProjectName_Core-Swift.h"
#import "ProjectName_Summary-Swift.h"
#import "ProjectName_WatchKit_Extension-Swift.h"
РЕДАКТИРОВАТЬ 4: Перекрестная видимость файлов -Swift.h
Я пробовал следующее:
- Добавлен класс Swift только в целевом приложении
- XCode создал заголовок Bridging Header
- Вставить #import "ProjectName_App-Swift.h" в файл ObjectiveC, используемый только приложением
- Использование класса Swift внутри этого файла
- Он компилируется! И я могу использовать класс Swift
Когда класс Swift определен для нескольких целей, а файл ObjectiveC используется этими несколькими целями, он не работает. Ошибки сборки выглядят следующим образом: Файл Target X → "ProjectName_TargetY-Swift.h" не найден. Кажется, что цель не может видеть другие цели -Swift.h.
Что я делаю неправильно? Спасибо за вашу помощь.