Як у Swift, як один виклик коду Objective-C?
Apple зазначила, що вони можуть співіснувати в одній програмі, але чи означає це, що технічно можна повторно використовувати старі класи, створені в Objective-C, будуючи при цьому нові класи в Swift?
Як у Swift, як один виклик коду Objective-C?
Apple зазначила, що вони можуть співіснувати в одній програмі, але чи означає це, що технічно можна повторно використовувати старі класи, створені в Objective-C, будуючи при цьому нові класи в Swift?
Відповіді:
Якщо у вас є існуючий клас, який ви хочете використовувати, виконайте крок 2 та перейдіть до кроку 5 . (У деяких випадках мені довелося додати явний текст
#import <Foundation/Foundation.h
до старого файлу Objective-C.)
Додайте .m
файл до свого класу та назвіть його CustomObject.m
.
Додаючи .m
файл, ви, швидше за все, отримаєте запит, який виглядає приблизно так:
Натисніть Так !
Якщо ви не побачили підказку або випадково видалили мостиковий заголовок, додайте новий .h
файл до свого проекту та назвіть його <#YourProjectName#>-Bridging-Header.h
.
У деяких ситуаціях, особливо під час роботи з рамками Objective-C, ви не додаєте явно клас Objective-C і Xcode не може знайти лінкер. У цьому випадку створіть .h
файл, названий вище, і переконайтеся, що ви пов’язали його шлях у налаштуваннях проекту вашої цілі так:
Примітка:
Найкраще зв'язати проект за допомогою $(SRCROOT)
макросу, щоб, якщо ви перемістили проект або працювали над ним з іншими, використовуючи віддалений сховище, він все одно буде працювати. $(SRCROOT)
можна розглядати як каталог, що містить ваш .xcodeproj файл. Це може виглядати приблизно так:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Додайте інший .h
файл і назвіть його CustomObject.h
.
В CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
В CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
В YourProject-Bridging-Header.h
:
#import "CustomObject.h"
В SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Не потрібно явно імпортувати; ось для чого призначений мостовий заголовок.
Додайте .swift
файл до свого проекту та назвіть його MySwiftObject.swift
.
В MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
В SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Файл: <#YourProjectName#>-Swift.h
вже має бути створено автоматично у вашому проекті, навіть якщо ви не можете його побачити.
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Якщо завершення коду не веде себе так, як ви очікували, спробуйте запустити швидку збірку, ⌘⇧Rщоб допомогти Xcode знайти частину коду Objective-C з контексту Swift і навпаки.
Якщо ви додали .swift
файл до старого проекту і отримуєте помилку dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, спробуйте повністю перезапустити Xcode .
Хоча спочатку можна було використовувати чисті класи Swift (Не нащадки NSObject
), які видимі для Objective-C за допомогою @objc
префікса, це вже неможливо. Тепер, щоб бути видимим в Objective-C, об'єкт Swift повинен бути або класом, відповідним NSObjectProtocol
(найпростіший спосіб зробити це успадковувати NSObject
), або бути enum
позначеним знаком @objc
необробленого типу якогось цілого типу типу Int
. Ви можете переглянути історію редагування для прикладу коду Swift 1.x, використовуючи @objc
без цих обмежень.
Дивіться посібник Apple щодо використання Swift з какао та Objective-C . У цьому посібнику висвітлено, як використовувати код Objective-C та C від Swift, і навпаки, а також рекомендації щодо перетворення проекту або змішування та співпадіння частин Objective-C / C та Swift у існуючий проект.
Компілятор автоматично генерує синтаксис Swift для виклику функцій C та методів Objective-C. Як видно з документації, цей Ціль-C:
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
перетворюється на цей код Swift:
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)
Xcode також робить цей переклад на льоту - ви можете скористатись функцією Open Quick під час редагування файлу Swift та ввести ім'я класу Objective-C, і він перенесе вас до Swift-версії заголовка класу. (Ви також можете отримати це, натиснувши cmd на символ API у файлі Swift.) А вся довідкова документація API у бібліотеках розробників iOS 8 та OS X v10.10 (Yosemite) видно як у Objective-C, так і у Swift форми (наприклад UIView
).
Ось покрокові вказівки щодо використання коду Objective-C (у даному випадку - рамки, наданої третьою стороною) у проекті Swift:
Простими кроками:
З'являється підказка, а потім натисніть кнопку ОК ... Якщо вона не з'являється, ми створюємо її вручну, як у наступному ... Створіть один заголовок з джерела iOS та дайте ім'я ProjectName-Bridging-Header (приклад: Тест -Bridging-Header), а потім перейдіть до створення параметра в коді компілятора Swift -> Bridge-Objective-C додайте назву моста Objective-C .. (Test / Test-Bridging-Header.h). Так, це повно.
За бажанням видаліть доданий вами файл Objective-C (з ім'ям "що-небудь" на GIF-зображенні вище). Вам це вже не потрібно.
Відкрийте файл мостового заголовка - ім'я файлу має форму [YourProject] -Bridging-Header.h . Він включає коментар, наданий Xcode. Додайте рядок коду до файлу Objective-C, який ви хочете включити , наприклад, стороннього фрейму. Наприклад, щоб додати Mixpanel до свого проекту, вам потрібно буде додати наступний рядок коду до файлу мосту, який знаходиться в мості:
#import "Mixpanel.h"
Тепер у будь-якому файлі Swift ви можете використовувати наявний код Objective-C у синтаксисі Swift (у разі цього прикладу, і ви можете зателефонувати за методом Mixpanel SDK тощо). Потрібно ознайомитись із тим, як Xcode перекладає Objective-C на Swift. Посібник Apple - це швидке читання. Або дивіться цю відповідь для неповного резюме.
Приклад для Mixpanel:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Mixpanel.sharedInstanceWithToken("your-token")
return true
}
Це воно!
Примітка: Якщо ви видалите файл мостового заголовка зі свого проекту , не забудьте зайти в «Налаштування збірки» та вилучити значення для « Об’єктивного заголовка об'єктива-C » у розділі «Швидкий компілятор - генерація коду».
Ви можете прочитати хороший пост Swift & Cocoapods . В основному нам потрібно створити містковий файл заголовка і помістити туди всі заголовки Objective-C. І тоді нам потрібно посилатися на це з наших параметрів збірки. Після цього ми можемо скористатися кодом Objective-C.
let manager = AFHTTPRequestOperationManager()
manager.GET(
"http://example.com/resources.json",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!,
responseObject: AnyObject!) in
println("JSON: " + responseObject.description)
},
failure: { (operation: AFHTTPRequestOperation!,
error: NSError!) in
println("Error: " + error.localizedDescription)
})
Також ознайомтеся з документом Apple, що використовує Swift з какао та Objective-C .
Я написав простий проект Xcode 6, який показує, як змішувати код C ++, Objective-C і Swift:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
Зокрема, у прикладі називається функція Objective-C та C ++ від Swift .
Ключовим моментом є створення спільного заголовка Project-Bridging-Header.h та розміщення там заголовків Objective-C.
Завантажте проект як повний приклад.
Я дуже вдячний за відповідь @ Логана. Це дуже допомагає створити міст-файл та налаштування.
Але виконуючи всі ці кроки, я все ще не отримую клас Objective-C у Swift.
Я використав cocoapods
бібліотеку та інтегрував її у свій проект. Який є pod "pop"
.
Отже, якщо ви використовуєте стручки Objective-C у Swift, то, можливо, ви не зможете потрапити або import
класи в Swift.
Просте, що вам потрібно зробити:
<YOUR-PROJECT>-Bridging-Header
файлу та#import <ObjC_Framework>
на@import ObjC_Framework
Наприклад: (Поп-бібліотека)
Замініть
#import <pop/POP.h>
з
@import pop;
Використовуйте, clang import
коли #import
не працює.
Цитата з документації :
Будь-який фреймворк Objective-C (або бібліотека C), доступний як модуль, можна імпортувати безпосередньо в Swift. Сюди входять усі системні системи Objective-C - такі як Foundation, UIKit та SpriteKit - а також загальні бібліотеки C, що постачаються разом із системою. Наприклад, щоб імпортувати Foundation, просто додайте цю заяву про імпорт у верхню частину файлу Swift, в якому ви працюєте:
import Foundation
Цей імпорт робить усі API API - включаючи NSDate, NSURL, NSMutableData та всі їх методи, властивості та категорії - безпосередньо доступними в Swift.
Лише примітка для того, хто намагається додати бібліотеку Objective-C до Swift: Вам слід додати -ObjC у Налаштуваннях збірки -> Зв'язування -> Інші прапорці Linker .
Після створення мостового заголовка перейдіть до Налаштування збірки => Пошук "Об'єктивного заголовка мостів".
Внизу ви знайдете файл "" Створений об'єктив-C ім'я заголовка інтерфейсу ".
Імпортуйте цей файл у контролер перегляду.
Приклад: У моєму випадку: "Dauble-Swift.h"
Клацніть на меню Новий файл і виберіть мову вибору файлу Ціль. У той час він автоматично генерує файл "Об'єктивний-C Bridging Header", який використовується для визначення деякої назви класу.
"Об’єктивний заголовок" Objective-C "під" Швидким компілятором - генерація коду ".
У проекті Swift 4.2.1 в Xcode 10.1 ви можете легко додати файл Objective-C. Виконайте наведені нижче дії, щоб перенести файл Objective-C до проекту Swift.
Step_01: Створіть новий проект Xcode за допомогою мови Swift:
File
> New
> Project
> objc
.
Step_02: До проекту Swift додайте новий файл Objective-C:
File
> New
> File...
> macOS
> Objective-C File
.
Step_03: Якщо ви додасте новий файл Objective-C до проекту Swift в перший раз, Xcode запитує вас:
Would you like to configure an Objective-C bridging header
?
Крок_04: Виберіть параметр:
Create Bridging Header
.
Step_05: Відповідний файл буде створений з ім'ям:
Objc-Bridging-Header.h
.
Step_06: Тепер вам потрібно встановити шлях до файлу Bridge у заголовку мосту. У Навігаторі проектів натисніть на проект з ім'ям objc
та виберіть:
Build Settings
> Objective-C Bridging Header
> Objc-Bridging-Header.h
.
Step_07: перетягніть і впустіть Objc-Bridging-Header.h
у це поле, щоб створити шлях до файлу.
Step_08: Відкрийте Objc-Bridging-Header.h
файл та імпортуйте файл Objective-C, який ви хочете використовувати у своєму файлі Swift.
#import "SpecialObjcFile.m"
Ось зміст SpecialObjcFile.m
:
#import <Foundation/Foundation.h>
@interface Person: NSObject {
@public
bool busy;
}
@property
bool busy;
@end
Step_09: Тепер у вашому файлі Swift ви можете використовувати клас Objective-C:
override func viewDidLoad() {
super.viewDidLoad()
let myObjcContent = Person()
print(myObjcContent.busy)
}
Відповідь Logans працює чудово, за винятком того, що останнім часом Swift 5
це дає деяку помилку компілятора. Ось виправлення для людей, які працюють на Swift 5.
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val" as AnyObject
override init() {}
func someFunction(someArg:AnyObject) -> String {
let returnVal = "You sent me \(someArg)"
return returnVal
}
}
Додати заголовок .h
і реалізація .m
файлів - файл класу какао (Objective-C) ,
наприкладMyFileName
налаштування мостового заголовка
Коли ви бачите Would you like to configure an Objective-C bridging header
клацання - Так
<target_name>-Bridging-Header.h
буде генеровано автоматичноДодати клас в Bridging-Header
In <target_name>-Bridging-Header.h
Додати рядок#import "<MyFileName>.h"
PS Якщо вам слід додати наявні файли Objective-C до проекту Swift, додайте Bridging-Header.h
заздалегідь
Додайте а <MyFileName>.swift
та розширюєNSObject
Імпорт швидких файлів до класу ObjC
Додайте #import "<#YourProjectName#>-Swift.h"
у файл Objective-C
Позначити публічний код Swift [@objc та @objcMembers]
Apple запропонувала офіційний посібник у цьому документі: як зателефонувати-об'єктивно-c-код-від-швидкого
Ось відповідна частина:
Щоб імпортувати набір файлів Objective-C в код Swift в межах однієї цілі програми, ви покладаєтесь на файл заголовка моста Objective-C, щоб відкрити ці файли Swift . Xcode пропонує створити цей заголовок, коли ви додасте файл Swift до вже наявного додатку Objective-C або файл Objective-C до вже наявного додатку Swift.
Якщо ви приймаєте, Xcode створює файл мостового заголовка разом з файлом, який ви створили, і називає його, використовуючи назву модуля продукту, а потім "-Bridging-Header.h". Крім того, ви можете створити мостиковий заголовок самостійно, вибравши Файл> Створити> Файл> [операційна система]> Джерело> Файл заголовка
Відредагуйте мостиковий заголовок, щоб виставити код Objective-C своєму коду Swift:
Будь-які загальнодоступні заголовки Objective-C, перелічені в мостовому заголовку, бачать Swift.
Двосторонній підхід до використання aim-c aim-c
1
2
Тепер добре йти Спасибі