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
相关产品推荐
相关产品推荐

