我正在尝试将我的 React-Native 0.33 代码桥接到一个超级简单的 Swift 方法,遵循 本指南,但我得到的只是
show:(NSString *)name is not a recognized Objective-C method
。
这是我的代码:
import Foundation
@objc(SwitchManager)
class SwitchManager: NSObject {
@objc func show(name: String) -> Void {
NSLog("%@", name);
}
}
#import "RCTBridgeModule.h"
@interface RCT_EXTERN_MODULE(SwitchManager, NSObject)
RCT_EXTERN_METHOD(show:(NSString *)name)
@end
#import "RCTBridgeModule.h"
然后在我的
index.ios.js
文件中,我使用 import { SwitchManager } from 'NativeModules';
导入 SwitchManager 并调用 SwitchManager.show('One');
。这就是错误发生的地方。
不知道出了什么问题。
这是 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 中仍然是这种情况,请参阅此处省略参数标签下的文档。
这在 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)
正如你在 Objective C 方法名称中看到的那样,是非标签参数,在 swift 方法中添加
_
到它
我整天都在与这个问题作斗争。通过将 Swift 编译器设置为使用旧版本(XCode 8 更喜欢 Swift 3)来解决,因此:
构建设置>向下滚动到“使用旧版 Swift 语言版本”设置为是。
我有同样的错误,因为我忘记将装饰器@objc放在函数声明之前
如果您有多个参数,您有以下选项:
目标-C:
RCT_EXTERN_METHOD(
addEvent
:(NSDictionary *) event
:(RCTPromiseResolveBlock) resolve
:(RCTPromiseRejectBlock) reject
)
快速选项 1:
@objc
func addEvent(
_ event: NSDictionary,
_ resolve: RCTPromiseResolveBlock,
_ reject: RCTPromiseRejectBlock
) {...}
快速选项 2:
@objc(addEvent:::)
func addEvent(
event: NSDictionary,
resolve: RCTPromiseResolveBlock,
reject: RCTPromiseRejectBlock
) {...}
目标-C:
RCT_EXTERN_METHOD(
addEvent
:(NSDictionary *) event
rejecter :(RCTPromiseResolveBlock) resolve
resolver :(RCTPromiseRejectBlock) reject
)
斯威夫特:
@objc
func addEvent(
_ event: NSDictionary,
resolver resolve: RCTPromiseResolveBlock,
rejecter reject: RCTPromiseRejectBlock
) {...}
来自 JavaScript、Java 和现在的 React Native 模块编程,我认为这些标签弊大于利,尤其是第一个标签无法设置。现在每个学习 Objective C 的人都会好奇并努力学习这一点。至少它们在 Objective C 中是可选的,但如果你将它与 Swift 结合起来,它又会变得疯狂。因为一切都没有意义,所以我测试了 XCode 15 中的所有可能的变体。我在这方面损失了至少两天的时间,我希望它能对某人有所帮助。