我可以在不使用 Objective-C(纯 swift)的情况下向 React Native 公开 Swift 函数吗?

Can I expose a Swift function to React Native without using Objective-C (pure swift)?

我想知道我是否可以将我的 func navigateToLoginWidget 暴露给 React Native。这样就可以从RN触发了。

我已经设法将 React Native 附带的 Objective-C 模板更改为 Swift,如下所示:

import Foundation
import IBMCloudAppID
import BMSCore

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  
  var window: UIWindow?
  var bridge: RCTBridge!

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    // initializing App ID SDK
    let region = AppID.REGION_SOMEWHERE
    let backendGUID = "MY_TENANT_ID_FROM_IBM"
    AppID.sharedInstance.initialize(tenantId: backendGUID, region: region)
    
    // Initializing React Native front-end with Swift instead of Obj-c template
    let jsCodeLocation: URL

    jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index.js", fallbackResource:nil)
    let rootView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "MY_PROJECT_NAME", initialProperties: nil, launchOptions: launchOptions)
    let rootViewController = UIViewController()
    rootViewController.view = rootView

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = rootViewController
    self.window?.makeKeyAndVisible()

    return true
  }
  
  func application(_ application: UIApplication, open url: URL, options :[UIApplication.OpenURLOptionsKey : Any]) -> Bool {
      return AppID.sharedInstance.application(application, open: url, options: options)
  }
  
  func navigateToLoginWidget(_ sender : Any) {
    print("clicked")
    AppID.sharedInstance.loginWidget?.launch(delegate: SigninDelegate)
  }
  
}

我通常会在另一个名为 SigninDelegate.swift 的模块中使用此函数,但出于解释目的,我将其包含在同一个 class 中。

根据 official documentation:

Swift doesn't have support for macros so exposing it to React Native requires a bit more setup but works relatively the same.

是的,这是可能的,但需要一些设置。查看上面 link 中的文档,了解您需要遵循的设置步骤。