Вызов функции swift из target-c ++ - PullRequest
0 голосов
/ 04 июня 2019

У меня проблемы с вызовом swift-методов и использованием swift-классов в коде target-c ++.У меня есть следующий класс в Swift:

@objc class MetalRenderer : NSObject
{
    // implementation
    ...
}

Затем у меня есть файл заголовка, в котором у меня есть предварительное объявление @class MetalRenderer; и в исходный файл (.mm) я включаю "Project-Swift.h" файл и создание экземпляра класса swift и вызов методов для этого класса, без проблем.Однако, когда я пытаюсь привести свой класс в соответствие с MTKViewDelegate, код протокола больше не работает.Вот что у меня есть в swift:

@objc class MetalRenderer : NSObject, MTKViewDelegate
{
    // implementation
    ...

    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
        //...
    }

    func draw(in view: MTKView) {
        //...
    }
}

Тот же заголовочный файл, включая тот же файл "Project-Swift.h" в .mm.Однако теперь .mm не удается скомпилировать, с

Нет типа или протокола с именем 'MTKViewDelegate'

Я разработчик C ++ с небольшим пониманием Obj-C /Obj-C ++ / Swift.Я понимаю, что есть проблема в файле "-Swift.h", который не знает протокол MTKViewDelegate.Один и тот же файл включает в себя как платформы Metal, так и MetalKit, в которых есть определения этих протоколов.Однако этот импорт окружен защитой препроцессора для некоторых модулей.Я нашел несколько сообщений о людях, имеющих схожие проблемы, и предлагаемые решения - избавиться от некоторых включенных циклических ссылок, которых нет в моем случае (я полагаю), или использовать быстрый код в Objective-C, а не в Objective-C ++,Я завернул свой код в класс Objective-C, и он снова работает, но я не понимаю, почему я не могу вызвать его напрямую из Objective-C ++, потому что код в основном такой же, и я не удовлетворен тем, что у меня естьчтобы обеспечить ненужную косвенность обертывания этого кода.У меня вопрос: можно ли напрямую вызывать методы класса swift из target-c ++, почему он не работает (возможно, из-за этих модулей, но что это, как они работают?)?

1 Ответ

0 голосов
/ 04 июня 2019

Однако этот импорт окружен защитой препроцессора для некоторых модулей.

Похоже, вы уже ответили на свой вопрос: платформа MetalKit не включена.

Youможет просто объявить прототип протокола MTKViewDelegate, если импорт всей инфраструктуры вызывает проблемы

...