从 Objective-C++ 调用 swift 函数

问题描述 投票:0回答:3

我在调用 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 类方法,为什么它不起作用(可能是因为这些模块,但它们是什么,它们如何工作?)?

objective-c swift objective-c++
3个回答
0
投票

然而,这些导入被某些模块的预处理器防护包围。

看起来您已经回答了您的问题:不包括 MetalKit 框架。

如果导入整个框架造成麻烦,你可以只声明

MTKViewDelegate
协议原型


0
投票

MetalKit
文件顶部导入
.mm

#import <MetalKit/MetalKit.h>
#import "Project-Swift.h"

我遇到了完全相同的问题,这为我解决了。


0
投票

我在

#import
文件中添加了
.pch
并且成功了。

© www.soinside.com 2019 - 2024. All rights reserved.