可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to bridge my React-Native 0.33 code to a super simple Swift method, following this guide but all I'm getting is show:(NSString *)name is not a recognized Objective-C method.
Here's my code:
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"
Then on my index.ios.js file I'm importing SwitchManager with import { SwitchManager } from 'NativeModules'; and calling SwitchManager.show('One');. This is where the error happened.
Not sure what's wrong.
回答1:
I was fighting with this issue all day. Resolved by setting the Swift Compiler to use Legacy versions (XCode 8 is prefers Swift 3), so in:
Build Settings > Scroll down to 'Use Legacy Swift Language Version' set as Yes.
回答2:
This is a part of Swift 3's changes and can be solved by adding an underscore:
import Foundation @objc(SwitchManager) class SwitchManager: NSObject { @objc func show(_ name: String) { NSLog("%@", name); } }
See Swift 3's 0046 Proposal: Establish consistent label behavior across all parameters including first labels that is called out in the Swift.org migration guide under "Consistent first argument labels".
Basically, how Objective-C sees Swift methods has changed with Swift 3.
EDIT: This is still the case in Swift 4, see docs here under Omitting Argument Labels.
回答3:
this worked for me in xcode 8.0 and swift 3
@objc func openPresentedViewController(_ name: String,name1: String,name2: String){ }
add _ to non labelled members
RCT_EXTERN_METHOD(methodName:(NSString *)name name1:(NSString *)name1 name2:(NSString *)name2)
as you can see in the objective c method name is nonlabeled parameter add _ to it in the swift method