如何在React Native Turbo Module中使用Swift代码?
问题描述
按照官方指南创建Turbo Module后,尝试在其中引入Swift代码实现加法功能:添加了SwiftCalculator.swift文件,修改RTNCalculator.mm通过Objective-C调用Swift逻辑,同时在pod spec中配置了桥接头文件,却触发错误:Using bridging headers with framework targets is unsupported。
相关代码
SwiftCalculator.swift
import Foundation @objc class SwiftCalculator: NSObject { @objc func add(a: Double, b: Double) -> Double { return a + b } }
RTNCalculator.mm
#import "RTNCalculatorSpec.h" #import "RTNCalculator.h" #import "RTNCalculator-Swift.h" @implementation RTNCalculator RCT_EXPORT_MODULE() - (void)add:(double)a b:(double)b resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { SwiftCalculator *calculator = [SwiftCalculator new]; double value = [calculator addWithA:a b:b]; NSNumber *result = [[NSNumber alloc] initWithDouble:value]; resolve(result); } - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared<facebook::react::NativeCalculatorSpecJSI>(params); } @end
报错的pod spec配置
s.pod_target_xcconfig = { 'SWIFT_OBJC_BRIDGING_HEADER' => '../../node_modules/rtn-calculator/ios/RTNCalculator-Bridging-Header.h' }
错误信息
Using bridging headers with framework targets is unsupported
解决方案
Turbo Module是以Framework形式构建的,iOS不允许Framework目标使用手动桥接头文件,需改用模块自动生成的交互头文件来实现Swift与Objective-C的互通,具体步骤:
移除pod spec中的桥接头文件配置
直接删除SWIFT_OBJC_BRIDGING_HEADER相关配置项,Framework不支持该设置。确认Swift类的暴露规则
你的SwiftCalculator已经正确添加@objc修饰并继承NSObject,这是Swift类能被Objective-C调用的必要条件,无需修改。保留自动生成的Swift头文件导入
代码中#import "RTNCalculator-Swift.h"是Framework自动生成的交互头文件,保留即可——这个头文件会自动包含所有暴露给Objective-C的Swift类和方法。添加Swift版本配置
在pod spec中声明Swift版本,确保项目能正确识别Swift代码:s.swift_version = "5.0" # 可根据项目实际使用的Swift版本调整
修正后的pod spec示例
s.swift_version = "5.0" s.pod_target_xcconfig = { # 移除SWIFT_OBJC_BRIDGING_HEADER配置 }
完成以上修改后,重新执行pod install再编译项目即可正常使用Swift代码。
内容的提问来源于stack exchange,提问作者Berry Blue

