Я написав бібліотеку в Swift, і мені не вдалося імпортувати її до мого поточного проекту, написаного в Objective-C.
Чи є способи імпортувати його?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Я написав бібліотеку в Swift, і мені не вдалося імпортувати її до мого поточного проекту, написаного в Objective-C.
Чи є способи імпортувати його?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Відповіді:
Вам потрібно імпортувати TargetName-Swift.h
. Зауважте, що це цільове ім'я - інші відповіді роблять помилку використання назви класу.
Цей єдиний файл є автогенерованим заголовком, який визначає інтерфейси Objective-C для всіх класів Swift у вашому проекті, які або анотовані, @objc
або успадковані від NSObject
.
Міркування:
Якщо ваше цільове ім’я містить пробіли, замініть їх на підкреслення (наприклад, My Project
стає My_Project-Swift.h
)
Якщо ваша мета - це рамка, вам потрібно імпортувати <TargetName/TargetName-Swift.h>
Переконайтесь, що ваш файл Swift є членом цілі
Інструкції з веб-сайту 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.
NSObject
!!! ви не можете просто прямо заявити про class Blah
швидке і змусити його працювати. це має бутиclass Blah : NSObject
Ось що робити:
Створіть новий проект у Objective-C
Створіть новий .swift
файл
Клацніть файл Xcode Project
Клацніть Налаштування збірки
Знайдіть панель пошуку та знайдіть Модуль визначення .
Змініть значення на Так .
Пошук модуля продукту .
Змініть значення на назву вашого проекту.
У делегаті програми додайте наступне: #import "YourProjectName-Swift.h"
Примітка. Щоразу, коли ви хочете використовувати свій файл Swift, вам потрібно імпортувати наступний рядок:
#import "YourProjectName-Swift.h"
Defines module
в" Build settings
- Yes
це те, що для мене виправлено!
YourProjectName
у #import "YourProjectName-Swift.h"
назві буде проект з кроку 8. Корисно, якщо назва вашого проекту містить спеціальні символи, і ви не впевнені, як саме ви повинні його форматувати.
Перейдіть до створення параметрів у файлі проекту та знайдіть "Ім'я заголовка інтерфейсу, створеного об'єктивом-C" . Значенням цього властивості є ім'я, яке слід включити.
Якщо ваше властивість "Назва модуля продукту" (те, від якого вказана вище властивість за замовчуванням залежить), залежить від того, компілюєте ви для тесту / налагодження / випуску / тощо (як це робиться в моєму випадку), тоді зробіть це властивість незалежним від цього варіант, встановивши власну назву.
Імпорт 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
Перший крок:-
Виберіть ціль проекту -> Налаштування збірки -> Пошук ('Визначити') -> Визначити значення оновлення модуля Ні на Так
"Визначає модуль": ТАК .
"Завжди вставляйте швидкі стандартні бібліотеки": ТАК .
"Встановити заголовок сумісності 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"
Є одне застереження, якщо ви імпортуєте код Swift у свої файли Objective-C в тій самій рамці. Ви повинні зробити це із зазначенням назви рамки та кутових дужок:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
ось налаштування збірки "Назва модуля продукту" ( PRODUCT_NAME = MyFramework
).
Просто додавати #import "MyFramework-Swift.h"
не вийде. Якщо ви перевіряєте каталог вбудованих продуктів (до того, як #import
такий доданий, щоб у вас була принаймні одна успішна збірка з деяким кодом Swift у цілі), ви все одно повинні побачити файл MyFramework-Swift.h
у Headers
каталозі.
Якщо у вас є проект, створений у 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 та Objective C у тому ж проекті
Ви повинні імпортувати
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
Отже, це не ім’я класу, як ви писали, а назва вашого модуля продукту, і це стосується імпорту всіх швидких файлів, а не лише конкретних
Шукайте "Ім'я заголовка інтерфейсу, створене об'єктивом-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"
.
Якщо ви хочете використовувати файл Swift у класі Objective-C , то з Xcode 8 ви можете виконати наступні кроки:
Якщо ви створили проект в Objective-C:
Скомпілюйте його, і якщо він призведе до помилки лінкера на зразок: компільовано з новою версією мови Swift (3.0), ніж попередні файли (2.0) для архітектури x86_64 або armv 7
Зробіть ще одну зміну у своєму
Побудувати та запустити.
Будьте обережні з тире та підкресленнями, вони можуть бути змішані, а назва вашого проекту та цільове ім’я не будуть такими ж, як SWIFT_MODULE_NAME.
#import <TargetName-Swift.h>
ви побачите, коли ви входите з клавіатури #import <і після автоматичного Xcode дасть вам поради.
Знайдіть файл .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