Как импортировать код Swift в Objective-C?

Я написал библиотеку в Swift, и я не смог импортировать ее в свой текущий проект, написанный в Objective-C.

есть ли способы импортировать его?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

13 ответов


вам нужно импортировать TargetName-Swift.h. Обратите внимание, что это целевое имя - другие ответы делают ошибку, используя имя класса.

этот единственный файл является автогенерированным заголовком, который определяет интерфейсы Objective-C для всех классов Swift в вашем проекте, которые либо аннотируются @objc или наследовать от NSObject.

вопросы:

  • если ваше целевое имя содержит пробелы, замените их символами подчеркивания (например,My Project будет My_Project-Swift.h)

  • если ваша цель является фреймворком, вам нужно импортировать <TargetName/TargetName-Swift.h>

  • убедитесь, что ваш файл Swift является членом целевого


инструкции с веб-сайта Apple:

импортировать Swift-код в Objective-C из той же структуры

под Параметры Построения, в упаковка убедитесь, что Определяет Модуль для этого целевого объекта framework задано значение да. Импорт кода Swift из этой Рамочной цели в любую цель-C .файл м внутри целевой объект framework, использующий этот синтаксис и заменяющий соответствующий имена:

#импорт " Имя_продукта-Swift.h"

изменения:

вы можете импортировать только " ProductName-Swift.h" in .m-файл.

файлы Swift в вашей цели будут видны в Objective-C.m-файл содержащий этот оператор import.

чтобы избежать циклических ссылок, не импортируйте Swift в Objective-C заголовочный файл. Вместо этого вы можете переслать объявите класс Swift для его использования в заголовке Objective-C. Обратите внимание, что вы не можете подкласс Swift класса в объективе-С.--1-->

enter image description here


вот что нужно делать:

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

  2. создать новый  

    • появится всплывающее окно и спрашиваете "вы хотите настроить заголовок моста Objective-C".
    • выбрать да.
  3. нажать на Проект Xcode файл

  4. нажать на кнопку Настройки Сборки

  5. найти поиска и ищите Определяет Модуль.

  6. изменить значение на да.

  7. Поиск Название Модуля Продукта.

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

  9. в делегате приложения добавьте следующее : #import "YourProjectName-Swift.h"


Примечание: всякий раз, когда вы хотите использовать свой файл Swift, вы должны импортировать следующую строку:

#import "YourProjectName-Swift.h"


Если вы используете Cocoapods и пытаетесь использовать Swift pod в проекте ObjC, вы можете просто сделать следующее:

@import <FrameworkName>;

enter image description here


перейдите к настройкам сборки в файле проекта и найдите " Objective-C Сгенерированное Имя Заголовка Интерфейса. значение этого свойства-это имя, которое вы должны включить.

Если ваше свойство " имя модуля продукта "(то, от которого зависит вышеуказанное свойство по умолчанию) изменяется в зависимости от того, компилируете ли вы для test / debug/release / etc (как в моем случае), то сделайте это свойство независимым от этого изменения, установив пользовательский имя.


импорт внутри Objective-c может вызвать эту ошибку, если она не import правильно.

Примечание: вам не нужно импортировать файлы Swift извне, вам просто нужно импортировать один файл, который заботится о файлах swift.

когда вы создан / скопирован Swift файл внутри цель-C проект. Это автоматически создало бы заголовок моста.

Регистрация Objective-C Generated Interface Header Name at Targets -> Build Settings.

enter image description here

на основе выше, я буду импортировать KJExpandable-Swift.h как она есть.

ваши будут TargetName-Swift.h, где TargetName отличается в зависимости от вашего имени проекта или другой цели, которую вы могли бы добавить и запустить на нем.

как ниже моей цели KJExpandable, так что KJExpandable-Swift.h
enter image description here


Первый Шаг:-

Выберите Цель Проекта - > Настройка Сборки - > Поиск ('Define') ->Определить Модуль обновить значение нет до Да

"Определяет Модуль": Да.

"Всегда Вставлять Стандартные Библиотеки Swift":Да.

" Установите Заголовок Совместимости Objective-C" : Да.

enter image description here

Второй Этап:-

добавить класс Swift file в Objective C".H-файл", как показано ниже

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Import ' ProjectName (Имя Вашего Проекта)-Swift.h 'in Objective C".файл м"

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

есть одно предостережение, если вы импортируете Swift-код в свои файлы Objective-C в том же основы. Вы должны сделать это, указав имя фреймворка и угловые скобки:

#import <MyFramework/MyFramework-Swift.h>

MyFramework вот параметр сборки "имя модуля продукта" (PRODUCT_NAME = MyFramework).

просто добавив #import "MyFramework-Swift.h" не будет работать. Если вы проверите встроенный каталог продуктов (перед таким #import добавляется, поэтому у вас была хотя бы одна успешная сборка с некоторые SWIFT-код цели), то вы все равно должны увидеть файл MyFramework-Swift.h на .


проверка предварительных заметок о 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"

искать "Objective-C Сгенерированное Имя Заголовка Интерфейса" в настройках сборки цели, которую вы пытаетесь построить (скажем, это MyApp-Swift.h) и импортируйте значение этого параметра (#import "MyApp-Swift.h") в исходном файле, где вы пытаетесь получить доступ к своим API Swift.

значение по умолчанию для этого поля является $(SWIFT_MODULE_NAME)-Swift.h. Вы можете увидеть его, если дважды щелкните в поле значение параметра "имя заголовка интерфейса, сгенерированного Objective-C.".

кроме того, если у вас есть тире в имени вашего модуля (скажем, это My-App), а затем в $(SWIFT_MODULE_NAME) все тире будут заменены подчеркиваниями. Так что вам придется добавить #import "My_App-Swift.h".


Если вы хотите использовать Swift на С класс, поэтому с Xcode 8 и далее вы можете выполнить следующие шаги:

Если вы создали проект в Objective-C:

  1. создать новый файл Swift
  2. Xcode будет автоматически запрашивать Bridge-Header file
  3. создать его
  4. Импорт " Имяпроекта-Swift.h " в контроллере Objective-C (импорт в реализации не в интерфейс) (если ваш проект имеет пространство между именем, поэтому используйте подчеркивание " имя_проекта-Swift.h")
  5. вы сможете получить доступ к классу Objective-C в Swift.

скомпилируйте его, и если он будет генерировать ошибку компоновщика, например: скомпилирован с более новой версией Swift language (3.0), чем предыдущие файлы (2.0) для архитектуры x86_64 или armv 7

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

  1. Xcode - > Проект - > Цель - > Настройки Сборки - > Использовать Наследие Swift Языковая Версия - > Да

сборка и запуск.


найти .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

если у вас есть проект, созданный в Swift 4, а затем добавлены файлы Objective C, выполните следующие действия

@objcMembers
public class MyModel: NSObject {
       var someFlag = false         // @objc
       func doSomething() {         // @objc
        print("doing something")
       }

}

ссылка https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/