Как я могу импортировать код Swift в Objective-C?
Я написал библиотеку на Swift и не смог импортировать ее в свой текущий проект, написанный на Objective-C.
Есть ли способы его импортировать?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Ответы
Ответ 1
Вам необходимо импортировать TargetName-Swift.h
. Обратите внимание, что это целевое имя - другие ответы делают ошибку при использовании имени класса.
Этот единственный файл является @objc
заголовком, который определяет интерфейсы Objective C для всех классов Swift в вашем проекте, которые либо аннотированы @objc
либо наследуются от NSObject
.
Соображения:
-
Если ваше целевое имя содержит пробелы, замените их подчеркиванием (например, My Project
становится My_Project-Swift.h
)
-
Если ваша цель - фреймворк, вам нужно импортировать <TargetName/TargetName-Swift.h>
-
Убедитесь, что ваш файл Swift является членом цели
Ответ 2
Инструкции с веб-сайта Apple:
Чтобы импортировать код Swift в Objective-C из той же структуры
В разделе Настройки сборки, в Упаковка убедитесь, что Определяет модульдля этой целевой рамки установлено значение Да. Импортировать код Swift из этой рамки в любой файл Objective-C.m внутри с использованием этого синтаксиса и подстановки соответствующего Имена:
#import "ProductName-Swift.h"
Revision:
Вы можете импортировать только "ProductName-Swift.h" в .m файлы.
Файлы Swift в вашей цели будут видны в файлах Objective-C.m содержащий этот оператор импорта.
Чтобы избежать циклических ссылок, не импортируйте Swift в Objective-Cфайл заголовка. Вместо этого вы можете перенаправить объявление класса Swift, чтобы использовать его в заголовке Objective-C. Обратите внимание, что вы не можете подклассифицировать класс Swift в Objective-C.
![enter image description here]()
Ответ 3
Вот что делать:
-
Создать новый проект в Objective-C
-
Создать новый файл .swift
- Появится всплывающее окно с вопросом "Хотите ли вы настроить заголовок моста Objective-C".
- Выберите Да.
-
Нажмите на свой файл проекта XCode
-
Нажмите на настройки сборки
-
Найдите панель поиска и найдите модуль Defines.
-
Измените значение на Да.
-
Поиск по названию модуля продукта.
-
Измените значение на имя вашего проекта.
-
В делегат приложения добавьте следующее: #import "YourProjectName-Swift.h"
Примечание: всякий раз, когда вы хотите использовать свой файл Swift, вы должны импортировать следующую строку:
#import "YourProjectName-Swift.h"
Ответ 4
Если вы используете Cocoapods и пытаетесь использовать Swift-модуль в проекте ObjC, вы можете просто сделать следующее:
@import <FrameworkName>;
![введите описание изображения здесь]()
Ответ 5
Перейдите к настройкам сборки в файле проекта и найдите "Objective-C Имя заголовка сгенерированного интерфейса. Значение этого свойства - это имя, которое вы должны включить.
Если ваше свойство "Product Module Name" (указанное выше свойство зависит от значения по умолчанию) изменяется в зависимости от того, компилируете ли вы для test/debug/release/etc (как в моем случае), тогда сделайте это свойство независимо от этого изменения, установив собственное имя.
Ответ 6
Импортирование файла Swift
внутри Objective-c
может привести к этой ошибке, если она не соответствует import
.
ПРИМЕЧАНИЕ. Вам не нужно импортировать файлы Swift извне, вам просто нужно импортировать один файл, который будет обрабатывать быстрые файлы.
Когда вы Создаете/Скопировали файл Swift внутри Objective-C проекта. Это создало бы заголовок моста автоматически.
Проверьте Objective-C Generated Interface Header Name
на Targets -> Build Settings
.
![введите описание изображения здесь]()
Основываясь на выше, я импортирую KJExpandable-Swift.h
как есть.
Ваш будет TargetName-Swift.h
, где TargetName
отличается в зависимости от вашего имени проекта или другой цели, которую вы могли бы добавить и запустить на нем.
Как ниже моя цель KJExpandable
, так что KJExpandable-Swift.h
![введите описание изображения здесь]()
Ответ 7
Первый шаг: -
Выберите цель проекта → Настройка сборки → Поиск ( "Определить" ) → Определить модуль
Обновить значение Нет до Да
"Определяет модуль": ДА.
"Всегда вставлять быстрые стандартные библиотеки": ДА.
"Установить Objective-C Заголовок совместимости": ДА.
![введите описание изображения здесь]()
Второй шаг: -
Добавить класс Swift в Objective C ".h" Файл ниже
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
Импортировать 'имя_проекта (ваше имя проекта) -Swift.h' в Objective C ".m" файл
//TestViewController.m
#import "TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import "ProjectName-Swift.h"
Ответ 8
Если вы импортируете Swift-код в свои файлы Objective-C в одной и той же структуре, вам нужно сделать оговорку. Вы должны сделать это, указав имя фрейма и угловые скобки:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
вот настройка сборки "Product Module Name" (PRODUCT_NAME = MyFramework
).
Просто добавление #import "MyFramework-Swift.h"
не будет работать. Если вы проверите каталог встроенных продуктов (до добавления такого #import
, так что у вас была хотя бы одна успешная сборка с некоторым кодом Swift в целевой), вы все равно должны увидеть файл MyFramework-Swift.h
в Headers
.
Ответ 9
Если у вас есть проект, созданный в Swift 4, а затем добавленные файлы Objective-C, сделайте это следующим образом:
@objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
}
Ссылка: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/
Ответ 10
Оформить предварительные выпуски о Swift и Objective C в том же проекте
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75
Вам следует импортировать
#import "SCLAlertView-Swift.h"
Ответ 11
Найдите "Objective-C Имя заголовка сгенерированного интерфейса" в настройках сборки целевого объекта, который вы пытаетесь построить (скажем, MyApp-Swift.h
), и импортируйте значение этого параметра (#import "MyApp-Swift.h"
) в исходном файле, где вы пытаетесь получить доступ к своим Swift API.
Значение по умолчанию для этого поля $(SWIFT_MODULE_NAME)-Swift.h
. Вы можете увидеть это, если вы дважды щелкните в поле значений параметра "Objective-C Generated Interface Header Name".
Кроме того, если у вас есть тире в имени вашего модуля (скажем, My-App
), то в $(SWIFT_MODULE_NAME)
все тире будут заменены символами подчеркивания. Итак, вам нужно добавить #import "My_App-Swift.h"
.
Ответ 12
Если вы хотите использовать Swift файл в классе Objective-C, поэтому с Xcode 8 и далее вы можете выполнить следующие шаги:
Если вы создали проект в Objective-C:
- Создать новый файл Swift
- Xcode автоматически предложит файл Bridge-Header
- Сгенерировать его
- Импортировать "ProjectName-Swift.h" в ваш контроллер Objective-C (импорт в реализации не в интерфейсе) (если в вашем проекте есть место между именами, используйте знак подчеркивания "Project_Name-Swift.h" )
- Вы сможете получить доступ к вашему классу Objective-C в Swift.
Скомпилируйте его, и если он будет генерировать ошибку компоновщика, например: скомпилированную с более новой версией языка Swift (3.0), чем предыдущие файлы (2.0) для архитектуры x86_64 или armv 7
Сделайте еще одно изменение в
- Xcode → Project → Target → Настройки сборки → Использовать устаревшую версию языка Swift → Да
Сборка и запуск.
Ответ 13
Будьте осторожны с черточками и подчеркиванием, они могут быть перепутаны, и имя вашего проекта и имя цели не будут совпадать с SWIFT_MODULE_NAME.
![Dashes and underscores]()
Ответ 14
#import <TargetName-Swift.h>
вы увидите при входе с клавиатуры #import & lt; и после автоматически Xcode посоветует вам.
Ответ 15
Найдите файл .PCH внутри проекта. и затем добавьте #import "YourProjectName-Swift.h"
Это импортирует заголовки классов. Так что вам не нужно импортировать в определенный файл.
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "YourProjectName-Swift.h"
#endif