У меня проблемы с вызовом 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 ++, почему он не работает (возможно, из-за этих модулей, но что это, как они работают?)?