Got "не является признанным методом Objective-C" при соединении Swift to React-Native

Я пытаюсь связать свой код 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 я импортирую SwitchManager с помощью import { SwitchManager } from 'NativeModules'; и вызывая SwitchManager.show('One');. Здесь произошла ошибка.

Не уверен, что случилось.

Ответы

Ответ 1

Я боролся с этой проблемой весь день. Решено, установив Swift Compiler для использования версий Legacy (XCode 8 предпочитает Swift 3), поэтому в:

Настройки сборки > Прокрутите вниз до " Использовать устаревшую версию языка Swift" как Да.

Ответ 2

Это часть изменений 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, см. документы здесь в разделе "Опускание ярлыков аргументов" .

Ответ 3

это работало для меня в 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)

как вы можете видеть в объекте с именем метода, является немаркированный параметр add _ к нему по быстрому методу