У меня есть старый проект Objective-C, и я хочу вызвать новую функцию и объект Swift, я создал файл " <ProjectName>-Bridging-Header.h
" и " <ProjectName>-Swift.h
"
Мне было легко вызвать функцию из Swift в Objective-C, но у меня проблема с обратным.
Итак, я создал простой класс «System.Swift».
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
Теперь я должен попытаться следовать документации здесь и внутри <...>-Swift.h
файла, который я написал
@class System;
@interface System : NSObject
-(void)printSome;
@end
и я импортировал его в свой класс Objective-C. В этот момент внутри моего класса Objective C (в настоящее время UIViewController) моего кода Objective-C я пытаюсь вызвать метод printSome:
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
теперь у меня следующая ошибка:
Неопределенные символы для архитектуры i386: « OBJC_CLASS $ _System», ссылка на которую: objc-class-ref в «ObjectiveC_Class_That_Call_Swift_Object» .o ld: символ (ы) не найден для архитектуры i386 clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
источник
Ответы:
Проблема решена, я ранее создал и включил новый
.h
файл в свой класс Objective-C с именем,<ProductModuleName>-Swift.h
но, как я обнаружил позже, в этом шаге нет необходимости, поскольку компилятор создает необходимый файл невидимым.Просто включите
<ProductModuleName>-Swift.h
в свой класс, и он должен работать.источник
@objc
префикс.-Swift.h
Была создана автоматически. У меня головная боль от того, что я могу вызывать сам класс, но не любую функцию внутри него. Кто-нибудь знает почему?<productModuleName>-.Swift.h
(нетmodel
).#import "My_Project-Swift.h"
.это странно но это сработает
1) Add @objc to Swift class 2) Add in .m #import "(ProjectName)-Swift.h" 3) Call from .h @class SwiftClass; 4)On SwiftClass click "Command" + Left Click (Apple Documantation) 5) To see "-Swift.h" -> click "Command" + Left Click
Приложение сгенерирует интерфейс для этого класса в -Swift.h
Пример: SWIFT_CLASS ("_ TtC10Project17220PLHelper") @interface PLHelper
источник
@objc (MyClassName)
(ProjectName)-Swift.h
, НЕ(ClassName)-Swift.h
!3) @class SwiftClassName;
спас меняПредположим, у нас есть имя проекта «MyFirstProjectOnSwift», имя быстрого класса «mySwiftClass» и класс objectiveC «MyObjectiveCLass».
Следующие шаги: -
источник
Проверьте файл -Swift.h, который импортирует ваш .m файл в объект-C:
#import <YourProjectName-Swift.h>
Щелкните эту строку и щелкните левой кнопкой мыши - Перейти к определению.
Этот файл следует включать автоматически, а не вручную.
источник
Если вы все еще не видите свой класс даже после импорта
<ProductModuleName>-Swift.h
.Убедитесь, что ваш класс является подклассом собственного класса (например
UIViewController
) или, по крайней мере, если это просто служебный класс, сделайте его подклассомNSObject
. Ваш класс должен теперь отображаться.источник
Небольшой дополнительный совет для тех, кто наткнулся на этот пост и для тех, у кого другие ответы не работают: вам также может потребоваться объявить свой класс Swift «общедоступным».
Пример:
@objc public class MySwiftClass: NSObject {
источник
Рекомендуемый способ выполнения кода Swift из Objective-C в проектах, которые переносятся с Obj-C на Swift, использует шаблон Bridge / Proxy.
import Foundation
@objc class AnalyticsPropertyBridge: NSObject {
private var analytics: AnalyticsManager = AnalyticsManager() @objc func refreshProperties() { self.analytics.set(AnalyticsProperty.clientType) }
}
#import "CallerModule.h"
3.a Импортировать зонтичный файл:
#import "MyProject-Swift.h"
3.b Вызовите мост.
[[AnalyticsPropertyBridge new] refreshProperties];
Преимущества: ваш быстрый код не испачкается с @objc, потому что код вызывается из Objc. Со временем ObjC будет уменьшаться в вашем проекте, и, наконец, невеста будет удалена.
источник
Хорошая статья, если у кого-то все еще есть проблемы.
Настройка совместимости Swift и Objective-C
источник