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

React Native Swift原生模块回调传非基础类型数据为null的解决方法

解决Swift原生模块向React Native传递数组和自定义对象的问题

核心原因

React Native的JS与原生桥接仅支持基础类型(字符串、数字、布尔值)、数组(元素需为支持类型)、字典(键为字符串,值为支持类型),自定义NSObject子类无法直接被桥接识别,会被转为null;同时参数传递的格式需与RN端回调的参数定义严格匹配。

解决方案步骤

1. 将自定义对象转换为字典

把Swift自定义类的属性转为[String: Any]格式的字典,这是RN能直接识别的结构。

修改你的Swift代码:

func displayProviderDialog(_ mvpds: [Any]) {
    class City: NSObject {
        var name: String = "TEST STRING"
        
        // 添加转字典方法,暴露属性给RN
        func toDictionary() -> [String: Any] {
            return [
                "name": name
            ]
        }
    }
    
    let city = City()
    // 若mvpds内是自定义对象,需逐个转为字典;基础类型直接保留
    let convertedMVPDs = mvpds.map { item in
        if let convertibleItem = item as? DictionaryConvertible {
            return convertibleItem.toDictionary()
        }
        return item
    }
    
    // 按RN端回调的参数数量传递,而非打包成单个数组
    rNCallbacks.displayProviderDialogCallback(convertedMVPDs, city.toDictionary())
}

// 定义协议统一处理自定义对象转字典逻辑
protocol DictionaryConvertible {
    func toDictionary() -> [String: Any]
}

// 让自定义类遵守协议
extension City: DictionaryConvertible {}

2. 匹配RN端回调的参数格式

你的TypeScript代码定义了两个入参,需确保Swift端传递的参数数量、结构对应:

export function displayProviderDialog(MVPDs: unknown[], city: { name: string }) {
    console.log(`${JSON.stringify(MVPDs)} >>>>>>>>>>>>> ${JSON.stringify(city)}`);
}

3. 额外注意事项

  • 如果mvpds是原生自定义对象数组,必须遍历每个元素转为字典,不能直接传递原数组;
  • 避免使用[Any]这类模糊类型,尽量明确类型,减少转换出错概率;
  • 嵌套结构需逐层转换,确保每一层都是基础类型、字典或数组的组合。

内容的提问来源于stack exchange,提问作者Mr. Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:50:37