2017-10-10 12 views
0

Je reçois le message suivant lors de l'exécution de ce programme simple ASObjc interfacé avec Swift:Sélecteur Unrecognized à Swift/Objective-C projet/AppleScript

*** -[ASMyObject foo:]: unrecognized selector sent to object <ASMyObject @0x60c000226fe0: OSAID(4) ComponentInstance(0x810000)> 

Le code fonctionne comme prévu si je supprime les paramètres de foo . Je me rends compte qu'il doit y avoir quelque chose de mal dans la façon dont je crée foo avec un paramètre.

est ici le code, basé sur this answer:

AppDelegate.swift

func applicationDidFinishLaunching(_ aNotification: Notification) { 
    ASObjC.shared().myObject.foo(5) 
} 

ASMyObject.applescript

script ASMyObject 
property parent : class "NSObject" 

on foo(value) 
    log value * 2 
    return "Success!" 
end foo 

end script 

ASObjC.h

@import Cocoa; 
@import AppleScriptObjC; 

@interface NSObject (MyObject) 
    - (NSString *)foo:(int)value; 
@end 

@interface ASObjC : NSObject 
    + (ASObjC *)shared; 
    @property NSObject * MyObject; 
@end 

ASObjC.m

#import "ASObjC.h" 

@implementation ASObjC 

+ (void)initialize 
{ 
    if (self == [ASObjC class]) { 
     [[NSBundle mainBundle] loadAppleScriptObjectiveCScripts]; 
    } 
} 

+ (ASObjC *)shared 
{ 
    static id shared = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     shared = [[ASObjC alloc] init]; 
    }); 

    return shared; 
} 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     _MyObject = [NSClassFromString(@"ASMyObject") new]; 
    } 
    return self; 
} 

@end 

Bridging-header.h

#import "ASObjC.h" 

Répondre

1

Vous devez ajouter un caractère de soulignement pour représenter le côlon dans ObjC

on foo_(value) 
    log value * 2 
    return "Success!" 
end foo 

alternativement

on foo:value 
    log value * 2 
    return "Success!" 
end foo 

et dans la catégorie que vous avez pour déclarer la méthode pour passer un objet, une primitive ObjC ne fonctionne pas.

- (NSString *)foo:(NSNumber *)value; 

Pour affecter la valeur du côté AppleScript vous devez le contraindre

on foo:value 
    log (value as integer) * 2 
    return "Success!" 
end foo 
+0

Hey @vadian! Cool de te voir ici. Dans les deux cas, j'obtiens maintenant une erreur EXC_BAD_ACCESS (code 1). – user3225395

+0

J'ai mis à jour la réponse. – vadian

+0

Incroyable! Merci beaucoup pour l'aide et la réponse originale d'il y a quelques années :) – user3225395