Я пытаюсь интегрировать Swift
код в мое приложение. Мое приложение написано в, Objective-C
и я добавил Swift
класс. Я сделал все, что описано здесь . Но моя проблема в том Xcode
, что -Swift.h
файл не создан , только заголовки моста. Я создал его, но на самом деле он пуст. Я могу использовать все свои классы ObjC в Swift, но не могу сделать это наоборот. Я пометил свой быстрый класс, @objc
но это не помогло. Что я могу сделать сейчас?
РЕДАКТИРОВАТЬ: Apple говорит: «Когда вы импортируете код Swift в Objective-C, вы полагаетесь на Xcode-generated
файл заголовка, чтобы открыть эти файлы для Objective-C. [...] Имя этого заголовка - это имя модуля вашего продукта с последующим добавлением« -Swift.h ”."
Теперь, когда я хочу импортировать этот файл, он выдает ошибку:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Вот мой файл FBManager.swift:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
источник
YourProjectName-Swift.h
Это должен быть магический заголовочный файл, который Xcode автоматически создает для вас во время компиляции (вы не увидите его в браузере проекта). Попробуйте удалить созданный вами#import YourProjectName-Swift.h
файл и добавить в файлы, в которых вы хотите использовать классы Swift.myProjectModule
?-Swift.h
Файл должен начинаться с названием приложения. У вас есть файл, оканчивающийся на-Bridging-Header.h
? Вам следует. Если это так, первая часть этого файла - это имя вашего проекта. Объедините первую часть этого имени с-Swift.h
и это то, что вы должны включить.-Swift.h
на моем Mac нет никакого файла, заканчивающегося файлом , и все же я могу включить его. Так что не зацикливайтесь на поиске такого файла. Просто убедитесь, что вы называете это правильно.#import <MyProjectName/MyProjectName-Swift.h>
Ответы:
Я потратил около 4 часов, пытаясь включить его
Swift
в своемXcode
проекте на базе Objective-C. Мойmyproject-Swift.h
файл был успешно создан, но мойXcode
не увидел мойSwift-classes
. Итак, я решил создать новыйXcode
проект на базе Objc и, наконец, я нашел правильный ответ! Надеюсь, этот пост кому-нибудь поможет :-)Пошаговая интеграция Swift для проекта Xcode Objc:
*.swift
файл (в Xcode) или добавьте его с помощью Finder.Objective-C bridging header
когда Xcode спросит вас об этом.Реализуйте свой класс Swift:
Откройте настройки сборки и проверьте следующие параметры:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Импортируйте заголовок интерфейса Swift в ваш файл * .m.
источник
"myproject-Swift.h"
поэтому мне кажется, что он не работает. Видимо, этот файл не виден в навигаторе проекта.#import "myproject-Swift.h"
.Не создавайте заголовочный файл самостоятельно. Удалить тот, который вы создали.
Убедитесь, что ваши классы Swift помечены
@objc
или наследуются от класса, который является производным (прямо или косвенно)NSObject
.Xcode не будет генерировать файл, если у вас есть какие-либо ошибки компилятора в вашем проекте - убедитесь, что ваш проект собирается правильно.
источник
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
чтобы увидеть, был ли файл создан с неожиданным именем, как это было для меня. :)Разрешите Xcode выполнять свою работу, не добавляйте / создавайте заголовок Swift вручную. Просто добавьте @objc перед вашим классом Swift.
В настройках вашего проекта найдите ниже флажки и измените его на ДА (как проект, так и цель)
Затем очистите проект и выполните сборку один раз, после того, как сборка завершится успешно (вероятно, следует), импортируйте указанный ниже файл заголовка в ваш файл .m класса target-c.
Boooom!
источник
Basic
наAll
в верхней панели.Embedded Content Contains Swift
был изменен наAlways Embed Swift Standard Libraries
Xcode 8: stackoverflow.com/questions/38792650/…Также, вероятно, полезно для тех из вас, у кого есть цель Framework :
Оператор импорта автоматически сгенерированного заголовочного файла немного отличается от целей приложения. В дополнение к другим вещам, упомянутым в других ответах, используйте
вместо того
согласно документации Apple на Mix & Match для целевых структур.
источник
Убедитесь, что ваш проект определяет модуль, и вы дали имя модулю. Затем перестройте, и Xcode создаст
-Swift.h
файл заголовка, и вы сможете импортировать.Вы можете установить определение модуля и имя модуля в настройках вашего проекта.
источник
Подробности: проект Objective-C с кодом Swift 3 в Xcode 8.1
Задачи:
ПОЛНЫЙ ОБРАЗЕЦ
1. Класс Objective-C, использующий перечисление Swift
Обнаружение кода Swift в коде Objective-C
В моем примере я использую SwiftCode.h для обнаружения кода Swift в Objective-C. Этот файл генерируется автоматически (я не создал физическую копию этого заголовочного файла в проекте), и вы можете только установить имя этого файла:
2. Класс Swift, использующий перечисление Objective-C
Обнаружение кода Objective C в коде Swift
Вам необходимо создать заголовочный файл моста. Когда вы добавляете файл Swift в проект Objective-C или файл Objective-C в проект Swift, Xcode предложит вам создать заголовок моста.
Вы можете изменить имя файла заголовка моста:
использование
результат
БОЛЬШЕ ОБРАЗЦОВ
3. Вызвать класс Swift из кода Objective-c
результат
4. Вызвать класс Objective-c из кода Swift
результат
5. Используйте расширение Swift в коде Objective-c
6. Используйте расширение Objective-c в быстром коде
источник
@objcMembers
перед классом. Поскольку@objc
вывод был уменьшен в Swift 4 для оптимизации. Например, свойство в классе, производном от NSObject, больше не будет выводить @objc по умолчанию (как это было в Swift 3). Я получил эту информацию из этого ответа .У меня была та же проблема, и оказалось, что специальные символы в имени модуля заменены на xcode (в моем случае штрихи заканчивались подчеркиванием). В настройках проекта установите флажок «имя модуля», чтобы найти имя модуля для вашего проекта. После этого либо используйте,
ModuleName-Swift.h
либо переименуйте модуль в настройках.источник
Файл создается автоматически (о Xcode 6.3.2 здесь). Но вы этого не увидите, так как он находится в папке «Производные данные». После того, как вы пометите свой swift класс
@objc
, скомпилируйте, затем найдитеSwift.h
в папке «Производные данные». Вы должны найти там заголовок Swift.У меня была проблема, что XCode переименовал мой
my-Project-Swift.h
вmy_Project-Swift.h
XCode не любит"." "-"
и т. Д. Символы. С помощью метода выше вы можете найти имя файла и импортировать его в класс Objective-C.источник
#import "my_project-Swift.h"
и мое настоящее имя проектаmy-project
Просто включите #import "myProject-Swift.h" в файл .m или .h
PS Вы не найдете "myProject-Swift.h" в файловом инспекторе, он скрыт. Но он генерируется приложением автоматически.
источник
Ответ @sig - один из лучших, однако он не работал для меня со старым проектом (не новым!), мне нужно было внести некоторые изменения. После многих изменений я нашел рецепт для себя (используя XCode 7.2):
Последний пункт (5) был решающим. Я помещаю его только во второй раздел (поле «Цели»), поле «Проект» следует оставить пустым: противном случае он не сгенерировал правильный файл "Project-Swift.h" для меня (он не включал быстрые методы).
источник
Define Modules
должно бытьNo
??Есть два условия,
Итак, для этой цели вы должны выполнить следующие шаги:
Зайдите в настройки сборки и выполните следующие шаги с поиском,
После этого очистите и восстановите ваш проект.
Используйте свой файл swift в файле target c.
В этом случае сначала напишите «@objc» перед вашим классом в файле swift.
После этого в вашей целевой файл c, напишите это,
Используйте ваш файл цели в файле Swift.
В этом случае, в своем заголовочном файле напишите это,
Я надеюсь, что это поможет вам.
источник
Для Swift 5:
@objc
ключевое слово в ваш класс и методыpublic
ключевое слово в ваш класс и методыNSObject
Поместите
#import "MyProject-Swift.h"
в свой файл Objective-Cисточник
В моем случае, кроме этих шагов:
Мне нужно было сделать класс общедоступным , чтобы создать файл productName-Swift.h :
источник
Я только что обнаружил, что добавление каталога быстрых файлов в проект не будет работать. Сначала нужно создать группу для каталога, затем добавить файлы swift ...
источник
У меня была та же проблема, и в конце концов оказалось, что они не были привязаны к одним и тем же целям. Класс ObjC присоединен к Target1 и Target2, класс Swift присоединен только к Target1 и не виден внутри класса ObjC.
Надеюсь, это кому-нибудь поможет.
источник
моя проблема заключалась в том, что я застрял после того, как xcode создал файл моста, но все же я получил ошибку в имени файла заголовка MYPROJECTNAME-swift.h
1. Я проверяю в терминале и ищу все автоматически созданные файлы быстрого моста:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
Вы видите, что создал XCode.
источник
Когда вы добавляете новые файлы Swift в проект, пожалуйста, убедитесь, что вы добавляете их в правильные цели. Пожалуйста, убедитесь, что каждый файл swift, который вы собираетесь использовать, наследует класс NSObject и имеет пометку @ObjCMembers. Измените на YES в настройках сборки в опции ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Измените на YES в настройках сборки под опцией DEFINES_MODULE.
источник
У меня та же ошибка:
myProjectModule-Swift.h
файл не найден ", но в моем случае реальная причина была в неправильной цели развертывания:"Swift
недоступна в OS X ранее 10.9; пожалуйста, установитеMACOSX_DEPLOYMENT_TARGET
значение 10,9 или выше (в настоящее время это «10,7»), поэтому, когда я изменил цель развертывания на 10,9 - проект успешно скомпилирован.источник
Моя проблема заключалась в том, что автоматическое создание файла -swift.h не смогло понять подкласс CustomDebugStringConvertible. Вместо этого я изменил класс на подкласс NSObject. После этого файл -swift.h теперь правильно включает класс.
источник
У меня были проблемы, связанные с тем, что я добавлял классы в свой мостовой заголовок target-c, а в импортированных заголовках target-c они пытались импортировать быстрый заголовок. Это не понравилось.
Поэтому во всех моих классах target-c, которые используют swift, но также имеют мостовые соединения, ключом было убедиться, что вы используете предварительные объявления классов в заголовках, а затем импортируйте файл "* -Swift.h" в файл .m.
источник
Мне не нужно было менять какие-либо настройки в сборке или добавлять @obj в класс.
Все, что мне нужно было сделать, это создать bridge-header, который автоматически создавался при создании классов Swift в проекте Objective-c. И тогда я просто должен был сделать
import "Bedtime-Swift.h" <- внутри файла target-c, необходимого для использования этого файла swift.
источник
ну, после прочтения всех комментариев, попыток, чтения и повторных попыток мне удалось включить быстрые классы в мой проект Big obj-c. Итак, спасибо за помощь. Я хотел поделиться одним советом, который помог мне лучше понять процесс. В классе .m, перешел к строке импорта целевого имени swift #import "myTargetName-Swift.h" и щелкнул ключ:
команда + щелчок мыши -> Перейти к определению
Там вы можете увидеть весь перевод от swift к obj-c, и вы найдете различные функции, повторно объявленные в obj-c. Надеюсь, этот совет поможет вам так же, как и мне.
источник
Использование Swift-классов в Objective-C
Если вы собираетесь импортировать код внутри цели приложения (смешивая Objective-C и Swift в одном проекте), вам следует использовать следующую строку импорта,
#import "<#YourProjectName#>-Swift.h"
чтобы представить код Swift в коде Objective-C [Смешивание кода Swift и Objective-C в проекте]В этом посте я опишу, как импортировать статическую библиотеку Swift в код Objective-C
Потребитель Objective-C -> Swift статическая библиотека
Версия Xcode 10.2.1
Создать статическую библиотеку Swift
Следуйте
Create Swift static library
со следующими дополнениями:Выставить Swift API. Использовать функции Swift из Objective-C [О программе]
После сборки вы должны найти
<product_name>-Swift.h
файл, который должен быть расположен вDerivedSources
[Файл не найден]Потребитель Objective-C со статической библиотекой Swift
Drag and drop
бинарный файл в проект Xcode [About]Link Library
[Неопределенные символы] [ссылка против встраивания]Добавить
Library Search paths
[Библиотека не найдена для] [Рекурсивный путь]Добавить
Header Search Paths
[Модуль не найден] [Рекурсивный путь]Добавить пустой
.swift file
в проект Objective-C. [Неопределенные символы] Когда Xcode спросит, нажмите CreateBridging Header
(он создастmodule_name-Bridging-Header.h
) и настройте путь к этому файлу вИмпортировать модуль в код клиента Objective C [файл не найден] [имя_модуля]
Больше примеров здесь
источник
XCode 11.3.1:
Когда я хочу использовать внутренний класс Swift в коде objc, он не компилируется для ошибки «неопределенный символ» (для внутреннего и внешнего класса), я проверял сгенерированный заголовок «-swift.h», и оба класса там.После нескольких часов попыток я преобразовываю внутренний класс в обычный класс, и он компилируется.Я очищаю проект, удаляю папку DerivedData и она компилируется.
источник
@objc
до объявления внутреннего класса?После всего вышеперечисленного я все еще получил ошибки. В итоге моя проблема заключалась в том, что нужные мне файлы Swift не были добавлены в ресурсы пакета.
Я исправил это, выбрав [MyTarget]> «Фазы сборки»> «Копировать ресурсы комплекта», затем нажал кнопку «плюс» и добавил файлы Swift.
источник