从Objective-C ++

时间:2019-06-04 14:27:24

标签: objective-c swift objective-c++

我在调用Swift方法和在Objective-C ++代码中使用Swift类时遇到问题。我很快就上了以下课:

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

然后我有一个头文件,其中有前向声明@class MetalRenderer;,在源(.mm)文件中,我包含“ Project-Swift.h” 文件,并实例化swift类并调用该类上的方法,没问题。但是,当我尝试使我的类符合MTKViewDelegate协议代码不再起作用。这就是我的迅速:

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

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

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

相同的头文件,并且在.mm中包括相同的“ Project-Swift.h”文件。但是,.mm现在无法编译,

  

没有名为“ MTKViewDelegate”的类型或协议

我是C ++开发人员,对Obj-C / Obj-C ++ / Swift不太了解。我了解到“ -Swift.h”文件中存在问题,该文件不知道MTKViewDelegate协议。相同的文件包括具有该协议定义的Metal和MetalKit框架。但是,这些导入被某些模块的预处理器保护程序所包围。我发现一些有关有类似问题的人的帖子,建议的解决方案是摆脱一些包含循环引用的内容,这些在我的情况下不存在(我想),或者在Objective-C中而不是在Objective-C ++中使用快速代码。我将代码包装在Objective-C类中,并且可以再次工作,但是我不明白为什么我不能直接从Objective-C ++调用它,因为代码基本相同并且我不满意提供包装该代码的不必要的间接访问。我的问题是,是否可以直接从Objective-C ++调用swift类方法,为什么它不起作用(可能是由于这些模块,但是它们是什么,它们如何工作?)?

1 个答案:

答案 0 :(得分:0)

  

但是,这些导入被某些模块的预处理器保护所包围。

您似乎已经回答了自己的问题:MetalKit框架未包含在内。

如果导入整个框架会造成麻烦,则只需声明MTKViewDelegate协议原型