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

问题描述 投票:0回答:5

我正在尝试将我的 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
文件中,我使用
import { SwitchManager } from 'NativeModules';
导入 SwitchManager 并调用
SwitchManager.show('One');
。这就是错误发生的地方。

不知道出了什么问题。

objective-c swift reactjs react-native
5个回答
81
投票

这是 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 中仍然是这种情况,请参阅此处省略参数标签下的文档


23
投票

这在 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 方法中添加

_
到它


3
投票

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

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


2
投票

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


0
投票

如果您有多个参数,您有以下选项:

1.如果您不想使用参数标签:

目标-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
  ) {...}

2.如果您想使用参数标签:

目标-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 中的所有可能的变体。我在这方面损失了至少两天的时间,我希望它能对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.