ZBLOG

尽量不要在同一个目标下同时使用 Objective-C 桥接头和模块(Enable Modules)。你可以选择不使用桥接头,直接用 @import 或者 import 来引入 Objective-C 和 C++ 代码。给予一个例子

好的,下面是一个如何在启用了模块的情况下,从 Swift 直接使用 Objective-C 和 C++ 代码的示例,而不使用桥接头文件。

步骤概述

  1. 创建 C++ 类
  2. 创建 Objective-C++ 包装类
  3. 在 Swift 中使用

1. 创建 C++ 类

首先,定义你的 C++ 类:

// MyCPPClass.h
#ifndef MyCPPClass_h
#define MyCPPClass_h

class MyCPPClass {
public:
    void doSomething();
};

#endif /* MyCPPClass_h */

// MyCPPClass.cpp
#include "MyCPPClass.h"
#include <iostream>

void MyCPPClass::doSomething() {
    std::cout << "Doing something in C++!" << std::endl;
}

2. 创建 Objective-C++ 包装类

然后,创建一个 Objective-C++ 文件(.mm),来包装这个 C++ 类:

// MyBridge.h (Objective-C Header)
#import <Foundation/Foundation.h>

@interface MyBridge : NSObject

- (void)callDoSomething;

@end

// MyBridge.mm (Objective-C++)
#import "MyBridge.h"
#import "MyCPPClass.h"

@implementation MyBridge {
    MyCPPClass cppObject; // 实例化 C++ 对象
}

- (void)callDoSomething {
    cppObject.doSomething(); // 调用 C++
}

@end

3. 在 Swift 中使用

由于你已经设置了模块,可以直接在 Swift 文件中导入和使用它们,而无需使用桥接头文件。

在 Swift 文件中:

import Foundation // 导入 Foundation 框架, 根据需要选择其他模块或框架

@_exported import YourModuleName // 替换为你的目标模块名称,这样可以让Swift识别Objective-C及C++

class Example {
    func useCppFunction() {
        let bridge = MyBridge()
        bridge.callDoSomething() // 调用 ObjC 方法,这将间接调用 C++
    }
}

// 使用示例
let example = Example()
example.useCppFunction()

注意事项

  1. 确保模块化支持:请确保在项目设置中 Enable Modules (C and C++) 被设置为 YES。
  2. 命名空间:当你将目标名称作为模块引入时,请务必检查其命名规则和准确性,以避免冲突。
  3. 编译问题:如果出现编译问题,确认所有相关文件都已正确添加到构建目标,并且没有因编译顺序引发的问题。

这样,你就能够在启用了模块的环境下,不依赖于桥接头文件而直接从 Swift 调用 Objective-C 和 C++ 的代码。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7361

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?