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



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



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



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

13 ответов:

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

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

вопросы:

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

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

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

инструкции с сайта Apple:

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

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

#import " ProductName-Swift.h"

изменения:

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

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

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

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 ' в объективе с ".файл м"

//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 Generated Interface Header Name" в настройках сборки цели, которую вы пытаетесь построить (допустим, это MyApp-Swift.h), и импортировать значение этого параметра (#import "MyApp-Swift.h") в исходном файле, где вы пытаетесь получить доступ к своим API Swift.

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

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

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

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

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

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

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

  1. Xcode - > Project - > Target - > Build Settings -> Use Legacy Swift Language Version - > Yes

построить и запустить.

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

Comments

    Ничего не найдено.