Как я могу импортировать код 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

Вот что делать:

  1. Создать новый проект в Objective-C

  2. Создать новый файл .swift

    • Появится всплывающее окно с вопросом "Хотите ли вы настроить заголовок моста Objective-C".
    • Выберите Да.
  3. Нажмите на свой файл проекта XCode

  4. Нажмите на настройки сборки

  5. Найдите панель поиска и найдите модуль Defines.

  6. Измените значение на Да.

  7. Поиск по названию модуля продукта.

  8. Измените значение на имя вашего проекта.

  9. В делегат приложения добавьте следующее: #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/

Ответ 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

Сделайте еще одно изменение в

  1. 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