J'essaye de relier mon code React-Native 0.33 à une super simple Swift, en suivant ce guide mais tout ce que je reçois est show:(NSString *)name is not a recognized Objective-C method
.
Voici mon code:
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"
Ensuite, sur mon fichier index.ios.js
, J'importe SwitchManager avec import { SwitchManager } from 'NativeModules';
Et j'appelle SwitchManager.show('One');
. C'est là que l'erreur s'est produite.
Je ne sais pas ce qui ne va pas.
Je me battais avec ce problème toute la journée. Résolu en définissant le compilateur Swift pour utiliser les versions héritées (XCode 8 préfère Swift 3), donc dans:
Paramètres de construction> Faites défiler jusqu'à 'tiliser l'héritage Swift Version de la langue' défini comme Oui.
Cela fait partie des modifications de Swift 3 et peut être résolu en ajoutant un trait de soulignement:
import Foundation
@objc(SwitchManager)
class SwitchManager: NSObject {
@objc func show(_ name: String) {
NSLog("%@", name);
}
}
Voir Swift 3's 46 Proposition: Établir un comportement d'étiquette cohérent pour tous les paramètres, y compris les premières étiquettes qui est appelé dans le Guide de migration Swift.org sous "Étiquettes de premier argument cohérentes".
Fondamentalement, la façon dont Objective-C voit les méthodes Swift a changé avec Swift 3.
EDIT: C'est toujours le cas dans Swift 4, voir les documents ici sous Omitting Argument Labels .
cela a fonctionné pour moi dans xcode 8.0 et Swift 3
@objc func openPresentedViewController(_ name: String,name1: String,name2: String){
}
ajouter _
aux membres non étiquetés
RCT_EXTERN_METHOD(methodName:(NSString *)name name1:(NSString *)name1 name2:(NSString *)name2)
comme vous pouvez le voir dans le nom de la méthode Objective C est un paramètre non étiqueté add _
dans la méthode Swift