Як я можу імпортувати код Swift до Objective-C?


281

Я написав бібліотеку в Swift, і мені не вдалося імпортувати її до мого поточного проекту, написаного в Objective-C.

Чи є способи імпортувати його?

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

9
любимо цей проект!
SleepsOnNewspapers

Відповіді:


430

Вам потрібно імпортувати TargetName-Swift.h. Зауважте, що це цільове ім'я - інші відповіді роблять помилку використання назви класу.

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

Міркування:

  • Якщо ваше цільове ім’я містить пробіли, замініть їх на підкреслення (наприклад, My Projectстає My_Project-Swift.h)

  • Якщо ваша мета - це рамка, вам потрібно імпортувати <TargetName/TargetName-Swift.h>

  • Переконайтесь, що ваш файл Swift є членом цілі


5
Зауважте, що якщо ви спробуєте використовувати імпорт файлу Swift для імпорту, ви отримаєте помилку "Очікувано"; " після декларатора верхнього рівня ". у вашому файлі Swift після "імпорту фонду".
louielouie

8
EDIT: Примітка: щоб це працювало, ОБОВ'ЯЗКОВО вказати назву модуля проекту. Дивіться: stackoverflow.com/a/24064015/2085743
Рубен Мартінес-молодший

7
Я просто хотів би додати зауваження, що якщо в назві вашого проекту є якийсь пробіл або спеціальний символ, ви повинні замінити їх накреслення, наприклад, "My App" було б "My_App-Swift.h"
Hola Soy Edu Feliz Navidad

84
Чому це так важко і погано задокументовано?
uchuugaka

3
@lelelo Ні, цей файл протилежний цьому. Заголовок моста написаний розробником і дозволяє вводити символи Objective-C і C у свій код Swift. Файл Target-Swift.h автоматично генерується і дозволяє вашому коду Objective-C / C отримати доступ до символів Swift.
Білл

154

Інструкції з веб-сайту Apple:

Імпортувати код Swift в Objective-C з тієї ж рамки

У розділі " Налаштування збірки" в " Упаковка" переконайтесь, що для параметра "Установка модуля " для цілі рамки встановлено значення Так . Імпортуйте код Swift з цієї рамкової цілі у будь-який файл Objem-C .m у межах цієї рамкової цілі, використовуючи цей синтаксис та замінивши відповідні імена:

#import "ProductName-Swift.h"

Перегляд:

Ви можете імпортувати "ProductName-Swift.h" у файли .m.

Файли Swift у вашій цілі будуть видимі у файлах Objective-C .m, що містять цю заяву про імпорт.

Щоб уникнути циклічних посилань, не імпортуйте Swift у файл заголовка Objective-C. Натомість ви можете переслати клас Swift, щоб використовувати його у заголовку Objective-C. Зауважте, що ви не можете підкласирувати клас Swift в Objective-C.

введіть тут опис зображення


2
Мені допоміг лише імпорт "ProductName-Swift.h" у .m файли. Додаючи ж у файл .pch, було вказано "Неможливо знайти декларацію протоколу для" CLLocationManagerDelegate "; ви мали на увазі" NSLayoutManagerDelegate "?"
Альфонс Р. Дуза

@AJit це не безпосередньо, документація говорить про це. Найпростіший спосіб - створити клас Objective-C, який перекладається у форматі, який розуміє Objective-C ++. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Алехандро Іван

1
Зауважте, що ви маєте виходити з NSObject!!! ви не можете просто прямо заявити про class Blah швидке і змусити його працювати. це має бутиclass Blah : NSObject
Девід Т.

Варто прочитати цю відповідь у деяких випадках: stackoverflow.com/questions/26328034/… Залежно від того, що ви робите: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

Що робити, якщо ви хочете імпортувати розширення Swift?
Рікардо

150

Ось що робити:

  1. Створіть новий проект у Objective-C

  2. Створіть новий .swiftфайл  

    • З'явиться спливаюче вікно із запитом "Чи хотіли б ви налаштувати об'єктивний заголовок" Об'єктив-С " .
    • Виберіть Так .
  3. Клацніть файл Xcode Project

  4. Клацніть Налаштування збірки

  5. Знайдіть панель пошуку та знайдіть Модуль визначення .

  6. Змініть значення на Так .

  7. Пошук модуля продукту .

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

  9. У делегаті програми додайте наступне: #import "YourProjectName-Swift.h"


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

#import "YourProjectName-Swift.h"


1
Зміна значення " Defines moduleв" Build settings- Yesце те, що для мене виправлено!
Закарія Бракса

Вбудований вміст містить Свіфт: ТАК ВИКОРИСТОВУЙТЕ це
Mohit

4
хороша відповідь, але кроки 7-8 не потрібні в Xcode 7.3.1 і вище
Sam B

Працювали для мене! Дякую.
itsdamslife

1
Просто хочу додати, що YourProjectNameу #import "YourProjectName-Swift.h"назві буде проект з кроку 8. Корисно, якщо назва вашого проекту містить спеціальні символи, і ви не впевнені, як саме ви повинні його форматувати.
Чак Борис

40

Якщо ви використовуєте Cocoapods і намагаєтеся використовувати стручок Swift в проекті ObjC, ви можете просто зробити наступне:

@import <FrameworkName>;

введіть тут опис зображення


1
Дуже дякую! ти врятував мій день.
Еша

Це працює як принадність, якщо ми встановили швидку бібліотеку через Cocoapods. Оновлено !!!
NSPratik

21

Перейдіть до створення параметрів у файлі проекту та знайдіть "Ім'я заголовка інтерфейсу, створеного об'єктивом-C" . Значенням цього властивості є ім'я, яке слід включити.

Якщо ваше властивість "Назва модуля продукту" (те, від якого вказана вище властивість за замовчуванням залежить), залежить від того, компілюєте ви для тесту / налагодження / випуску / тощо (як це робиться в моєму випадку), тоді зробіть це властивість незалежним від цього варіант, встановивши власну назву.


15

Імпорт 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
введіть тут опис зображення


12

Перший крок:-

Виберіть ціль проекту -> Налаштування збірки -> Пошук ('Визначити') -> Визначити значення оновлення модуля Ні на Так

"Визначає модуль": ТАК .

"Завжди вставляйте швидкі стандартні бібліотеки": ТАК .

"Встановити заголовок сумісності Objective-C": ТАК .

введіть тут опис зображення

Другий крок: -

Додайте файл класу Swift в файл ".h" файла ".h", як показано нижче

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Імпортуйте "ProjectName (назва вашого проекту) -Swift.h" у файл об'єкта C ".m"

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

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

#import "ProjectName-Swift.h"

Попередня декларація (@class) класу - дуже хороший момент! Дякую!
Філіпп Отто

10

Є одне застереження, якщо ви імпортуєте код Swift у свої файли Objective-C в тій самій рамці. Ви повинні зробити це із зазначенням назви рамки та кутових дужок:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkось налаштування збірки "Назва модуля продукту" ( PRODUCT_NAME = MyFramework).

Просто додавати #import "MyFramework-Swift.h"не вийде. Якщо ви перевіряєте каталог вбудованих продуктів (до того, як #importтакий доданий, щоб у вас була принаймні одна успішна збірка з деяким кодом Swift у цілі), ви все одно повинні побачити файл MyFramework-Swift.hу Headersкаталозі.


8

Якщо у вас є проект, створений у 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/


У моєму коді, після того як я оновив його до Swift 4.2 з swift 3. Це не працює
SNarula

яку помилку ви отримуєте? Я використав вище код у Swift4.2 і його добре працює.
Прашант Бхаяні

Гаразд, це чудово.
Прашант Бхаяні

4

Ознайомтеся з примітками до випуску попереднього випуску 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"

3
Показав мені цю помилку: файл "SCLAlertView-Swift.h" не знайдено.
Віктор Радченко

2
Потрібно вказати назву проекту, а не ім'я файлу - дивіться мою відповідь.
Білл

1
Дякуємо за посилання на документацію. Це було корисно для довідок.
louielouie

2
Цитую з наданого посилання: The name of this header is your product module name followed by adding "-Swift.h".Отже, це не ім’я класу, як ви писали, а назва вашого модуля продукту, і це стосується імпорту всіх швидких файлів, а не лише конкретних
Кріс,

4

Шукайте "Ім'я заголовка інтерфейсу, створене об'єктивом-C" у Налаштуваннях збірки цілі, яку ви намагаєтеся створити (скажімо, це MyApp-Swift.h), та імпортуйте значення цього параметра ( #import "MyApp-Swift.h") у вихідний файл, до якого ви намагаєтесь отримати доступ. ваші API Swift.

Значенням за замовчуванням для цього поля є $(SWIFT_MODULE_NAME)-Swift.h. Ви можете побачити це, якщо двічі клацнути у полі значення параметра "Ім'я заголовка інтерфейсу, створеного об'єктивом-C".

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


Краще, ніж затверджено. Дефіси витратили 20 хв. Я ніколи не повернусь ха-ха.
Рой Мулія

3

Якщо ви хочете використовувати файл Swift у класі Objective-C , то з Xcode 8 ви можете виконати наступні кроки:

Якщо ви створили проект в Objective-C:

  1. Створіть новий файл Swift
  2. Xcode автоматично підкаже файл Bridge-Header
  3. Створіть це
  4. Імпортуйте "ProjectName-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 -> Settings settings -> Use Legacy Swift Version Version -> Так

Побудувати та запустити.


1
Я не отримую цього варіанту використання застарілої версії швидкої мови
rd_

1

Будьте обережні з тире та підкресленнями, вони можуть бути змішані, а назва вашого проекту та цільове ім’я не будуть такими ж, як SWIFT_MODULE_NAME.

Тире та підкреслення


1
#import <TargetName-Swift.h>

ви побачите, коли ви входите з клавіатури #import <і після автоматичного Xcode дасть вам поради.


-1

Знайдіть файл .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.