首页 > 解决方案 > 将一个以函数作为参数的 Swift 方法导出到 React Native

问题描述

我正在尝试将一个以函数作为参数的 Swift 方法导出到 React Native。我所做的如下:

RNMyClass.swift文件中:

import Foundation

@objc(RNMyClass)
class RNMyClass: NSObject {
  @objc func someMethod(_ successCallback: (String) -> Void) -> Void {
    //Some code goes here...
  }
}

RNMyClass.m文件中:

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(RNMyClass, NSObject)

RCT_EXTERN_METHOD(someMethod:((*)(NSString *))successCallback)

@end

我通过运行以下命令在 iOS 模拟器上启动程序:

npx react-native start

npx react-native run-ios

该代码在 XCode 13.0 上编译并开始在 iOS 模拟器 15.0 上运行,但是当它遇到我从 react native 调用此方法的部分时,iOS 程序崩溃并且模拟器进入主屏幕。

我在这里做错了什么?

标签: iosswiftobjective-cxcodereact-native

解决方案


事实证明,我应该使用RCTResponseSenderBlock像这样的讨厌的 Swift 闭包和 Objective-C 函数指针:

import Foundation

@objc(RNMyClass)
class RNMyClass: NSObject {
  @objc func someMethod(_ successCallback: RCTResponseSenderBlock) -> Void {
    successCallback([NSNull(), "response from swift"])
  }
}
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(RNMyClass, NSObject)

RCT_EXTERN_METHOD(someMethod:(RCTResponseSenderBlock)successCallback)

@end

React Native JavaScript 代码应该是这样的:

import { NativeModules } from 'react-native';

NativeModules.RNMyClass.someMethod((err, str) => console.log(str));

推荐阅读