You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:55:20