Xcode纯Swift项目中,C++能否调用Swift函数?
可行,通过Objective-C++中间层实现
C无法直接调用Swift,但可以借助**Objective-C**作为中间桥梁实现,纯Swift项目也能搞定,步骤如下:
1. 让Swift函数暴露给Objective-C
Swift类需要继承NSObject,并通过@objc或@objcMembers标记,才能被Objective-C识别。示例代码:
import Foundation // @objcMembers 让类里的所有方法都能被Objective-C调用 @objcMembers class SwiftAPI: NSObject { func processInput(_ input: String) -> Int { print("Swift方法被调用,输入内容:\(input)") return input.count } }
2. 编写C++可调用的桥接头文件
创建一个.h头文件(比如CppSwiftBridge.h),用C语言风格声明接口,避免C++名称污染:
#ifndef CppSwiftBridge_h #define CppSwiftBridge_h #ifdef __cplusplus extern "C" { #endif // 声明C++可直接调用的函数 int callSwiftProcess(const char* inputStr); #ifdef __cplusplus } #endif #endif /* CppSwiftBridge_h */
3. 实现Objective-C++中间层
创建一个.mm文件(比如CppSwiftBridge.mm),这个文件能同时兼容Objective-C和C语法,负责连接Swift和C:
#include "CppSwiftBridge.h" // 导入Xcode自动生成的Swift桥接头文件,格式为「项目名-Swift.h」,替换成你的项目名 #import "YourProjectName-Swift.h" int callSwiftProcess(const char* inputStr) { // 将C字符串转成Swift/Objective-C可用的NSString NSString* swiftInput = [NSString stringWithUTF8String:inputStr]; // 实例化Swift类并调用方法 SwiftAPI* api = [[SwiftAPI alloc] init]; return [api processInput:swiftInput]; }
4. 在C++代码中调用接口
直接导入桥接头文件,调用声明好的C风格函数即可:
#include "CppSwiftBridge.h" #include <iostream> int main() { const char* testInput = "来自C++的调用请求"; int result = callSwiftProcess(testInput); std::cout << "Swift方法返回值:" << result << std::endl; return 0; }
项目配置注意事项
- 确保
.mm文件被添加到Xcode项目的Target中 - 检查Build Settings里的
Objective-C Generated Interface Header Name,确认自动生成的Swift桥接头文件名正确(默认是项目名-Swift.h) - 若C++代码是外部引入的,要确保它和Swift代码在同一个Target下,或正确设置Target依赖
内容的提问来源于stack exchange,提问作者RandomDud1550
相关产品推荐
相关产品推荐

