将 Swift 桥接到 React-Native 时得到“不是公认的 Objective-C 方法”

IT技术 objective-c swift reactjs react-native
2021-03-26 02:04:00

我正在尝试按照本指南将我的 React-Native 0.33 代码桥接到一个超级简单的 Swift 方法,但我得到的只是show:(NSString *)name is not a recognized Objective-C method.

这是我的代码:

SwitchManager.swift

import Foundation

@objc(SwitchManager)
class SwitchManager: NSObject {

  @objc func show(name: String) -> Void {
    NSLog("%@", name);
  }

}

SwitchManagerBridge.h

#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(SwitchManager, NSObject)

RCT_EXTERN_METHOD(show:(NSString *)name)

@end

SwitchManager-Bridging-Header.h

#import "RCTBridgeModule.h"

然后在我的index.ios.js文件中,我导入 SwitchManagerimport { SwitchManager } from 'NativeModules';并调用SwitchManager.show('One');. 这就是错误发生的地方。

不知道出了什么问题。

4个回答

这是 Swift 3 更改的一部分,可以通过添加下划线来解决:

import Foundation

@objc(SwitchManager)
class SwitchManager: NSObject {

  @objc func show(_ name: String) {
    NSLog("%@", name);
  }

}

请参阅 Swift 3 的0046 提案:在所有参数之间建立一致的标签行为,包括Swift.org 迁移指南“一致的第一个参数标签”下调用的第一个标签。

基本上,Objective-C 对 Swift 方法的看法随着 Swift 3 发生了变化。

编辑:这在 Swift 4 中仍然如此,请参阅 Omitting Argument Labels 下的文档

是的,如果您查看文档,主要目标是保持与 Obj-C 库的兼容性。随着时间的推移,Apple 可能会尝试完全淘汰这种做法——事实上,仅 swift 的功能不需要这种下划线行为。它出现在这里的原因是 React Native 都是 Obj-C。
2021-05-24 02:04:00
这为我做到了。我可以确认这适用于 Swift 3 和 React Native 0.34.0-rc.0。
2021-05-27 02:04:00
tnx,它有效。它仍然是 Swift4 和 xcode 9.4.1 的情况
2021-06-05 02:04:00
优秀的!那个奇怪的下划线是怎么回事?有人可以解释一下吗?
2021-06-13 02:04:00
关于此的另一个注意事项:我的方法有 3 个参数,因此我为每个参数添加了下划线。这没有用!您必须将其添加到未标记的参数中
2021-06-20 02:04:00

这在 xcode 8.0 和 swift 3 中对我有用

@objc func openPresentedViewController(_ name: String,name1: String,name2: String){
}

添加_到无标签成员

RCT_EXTERN_METHOD(methodName:(NSString *)name name1:(NSString *)name1 name2:(NSString *)name2)

正如您在目标 c 方法名称中看到的那样_,在 swift 方法中添加未标记的参数

对我来说它没有用。我需要将@objc 声明修改为@objc(openPresentedViewController: name1: name2:)
2021-05-25 02:04:00
也为 Swift 5 工作过。
2021-06-17 02:04:00

我整天都在与这个问题作斗争。通过将 Swift Compiler 设置为使用 Legacy 版本来解决(XCode 8 更喜欢 Swift 3),因此在:

构建设置> 向下滚动到“使用旧版 Swift 语言版本”设置为“是”

这不应该是公认的答案,这只是一种解决方法。下面关于方法标签的解决方案是问题的实际解决方案。
2021-05-24 02:04:00
@mike-cole 看看下面。如果您遇到问题,请查看下划线是否有所不同,因为这是 Swift 3 中与 ObjC 方法兼容的更改。这不是每个人的问题的原因(我来到这里是因为一个不同的“不是公认的 Objective-C 方法”问题),但我猜这是一个常见的问题。
2021-06-01 02:04:00
这是否意味着您不能使用 Swift 3?我也遇到了这个问题,但如果可能的话,我想使用 Swift 3。
2021-06-06 02:04:00

我有同样的错误,因为我忘记在函数声明之前放置装饰器 @objc