Функция вызова Swift из класса Objective C
У меня проблема. У меня есть проект Old Objective C, и я хочу вызвать новую функцию Swift и объект, я создал файл "-Bridging-Header.h" и "-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 Code я пытаюсь вызвать метод printSome:
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
теперь у меня есть следующая ошибка:
Undefined символы для архитектуры i386: "_OBJC_CLASS _ $_ System", ссылка: objc-class-ref в "ObjectiveC_Class_That_Call_Swift_Object".o ld: символ (-ы) не найден для архитектуры i386 clang: error: linker команда с кодом выхода 1 (используйте -v для вызова вызова)
Кто-нибудь может мне помочь?
Относится ко всем.
Ответы
Ответ 1
Проблема. Я решил создать и включить новый .h
файл в мой класс Objective-C с именем <ProductModuleName>-Swift.h
, но, как я узнал позже, этот шаг не нужен, потому что компилятор создает необходимый файл невидим.
Просто включите <ProductModuleName>-Swift.h
в свой класс, и он должен работать.
Ответ 2
Да Спасибо
Это странно, но он будет работать
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
- (void) notifyForDownloading: (NSDictionary *) userInfo;
- (instancetype) init OBJC_DESIGNATED_INITIALIZER;
@end
Ответ 3
Предположим, что у нас есть ProjectName "MyFirstProjectOnSwift" и быстрое имя класса "mySwiftClass", а class ObjectC - "MyObjectiveCLass"
Следующие шаги: -
-
Добавить #import "MyFirstProjectOnSwift-Swift.h" в "MyObjectiveCLass.m"
-
Добавить @class mySwiftClass в MyObjectiveCLass.h;
-
Затем в MyObjectiveCLass.m
mySwiftClass * myclass= [mySwiftClass new]; {Звоните как это в любом метод, где вы хотите вызвать быстрый метод.}
-
[myClass methodName];
Ответ 4
Проверьте файл -Swift.h, который имеет импорт в вашем .m файле в objective-C:
#import <YourProjectName-Swift.h>
Нажмите на эту строку и щелкните левой кнопкой мыши - Перейти к определению.
Этот файл должен быть включен автоматически, а не вручную.
Ответ 5
Если вы еще не видите свой класс даже после импорта <ProductModuleName>-Swift.h
.
Убедитесь, что ваш класс подклассифицирует родной класс (например, UIViewController
) или, по крайней мере, если это просто класс утилиты, сделайте его подклассом NSObject
. Теперь ваш класс должен показать.