Доступ к переменным/функциям Objective-C из Swift

Предположим, у меня есть коннектор с именем Connector.m (написанный на Objective-C). И я хотел бы создать новый соединитель, написанный с использованием Swift, с именем Connector.swift. Я хотел бы получить доступ ко всем переменным и методам из Swift. Я создал мостовой заголовок и пишу импорт файла заголовка соединителя. Но я не могу получить доступ ни к одной из глобальных переменных класса Objective-C.

Connector.m

NSString * const kHTTP_METHOD_GET = @"GET";

Connector.swift

public class Connector: NSObject {

    var parentConnector : Connector

    override init() {
        self.parentConnector = Connector
    }

    func test() {
        print(parentConnector.kHTTP_METHOD_GET) //--> ERROR : Value of type 'Connector' has no member 'kHTTP_METHOD_GET'
    }

}

Можно ли сделать это? Спасибо.


person mrjimoy_05    schedule 21.01.2016    source источник


Ответы (4)


Убедитесь, что у вас есть заголовочный файл, подобный этому...

{project-name}-Bridging-Header.h

Добавьте файл класса в Bridging-Header.h.

#import "Connector.h"

И поместите приведенный ниже код в файл Connector.h. Потому что в Bridging-Header.h будет импортирован только файл заголовка

NSString * const kHTTP_METHOD_GET = @"GET";

поверх области @interface..

person Bhoomi Jagani    schedule 21.01.2016

Добавьте следующую строку в Connector.h.

extern NSString * const kHTTP_METHOD_GET;

Включите Connector.h в файл заголовка моста.

person Arun Ammannaya    schedule 21.01.2016
comment
Нужно ли использовать extern? - person Onur Tuna; 15.03.2019

Я считаю, что методы/переменные в Connector.m также должны быть общедоступными, чтобы он работал.

person chamille    schedule 21.01.2016
comment
Как это сделать? Кстати, переменные в Connector.m выходят за рамки @implementation. - person mrjimoy_05; 21.01.2016
comment
просто добавьте общедоступный public NSString * const kHTTP_METHOD_GET = @"GET"; - person chamille; 21.01.2016
comment
Кроме того, не пытаетесь ли вы получить доступ к экземпляру объекта swift, у которого нет члена с именем kHTTP_METHOD_GET? Я думаю, что вашему быстрому классу нужно другое имя. - person chamille; 21.01.2016
comment
Мы не можем добавить символ '@' вне области '@interface', и глобальная переменная не может быть на '@interface'. - person mrjimoy_05; 21.01.2016
comment
Я говорю, что ваш parentConnector имеет тип Connector.swift, а не Connector.h/m. Таким образом, у него нет члена, который вы хотите. Вам нужно сделать parentConnector типом вашего класса target-c. - person chamille; 23.01.2016

Это звучит как хороший пример использования Шаблон адаптера. Но вы должны иметь возможность легко получить доступ к коду Objective-C.

Убедитесь, что ваш заголовочный файл моста называется следующим образом:

{your-project-name}-Bridging-Header.h

Внутри вашего связующего заголовка добавьте следующее:

#import "Connector.m"

Затем вы должны убедиться, что компилятор знает о вашем заголовке моста:

Нажмите на свой корневой проект > выберите целевое приложение > Настройки сборки

Затем прокрутите вниз, пока не увидите это:

введите здесь описание изображения

Убедитесь, что ваш связующий заголовок указан в списке, создайте и у вас должен быть доступ к вашему коду Objective-C.

person Dan Beaulieu    schedule 21.01.2016
comment
Спасибо, но можем ли мы импортировать файлы реализации вместо файлов заголовков? У меня возникла ошибка при импорте файлов реализации, пишет не найдено. И да, я должен убедиться, что заголовок моста указан. - person mrjimoy_05; 21.01.2016
comment
хм... не уверен в этом, я просто знаю, как получить доступ к target-c, используя стандартный заголовок моста - person Dan Beaulieu; 21.01.2016