Функция вызова 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. Теперь ваш класс должен показать.