2017-10-10 85 views
0

运行与斯威夫特接口这个简单ASObjc程序时,我得到了以下信息:无法识别的选择/的Objective-C/AppleScript的项目

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

的代码按预期工作,如果我从foo删除参数。我意识到在创建foo参数方面肯定会出现问题。

下面的代码,根据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 

桥接-Header.h

#import "ASObjC.h" 

回答

1

你必须添加下划线字符来表示ObjC

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

替代地

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

和您所拥有的类别要声明该方法传递一个对象,ObjC原语不起作用。

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

指派该值的AppleScript的一侧,你必须强迫它

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

嘿@vadian!很高兴在这里见到你。在这两种情况下,我现在都会得到一个EXC_BAD_ACCESS错误(代码1)。 – user3225395

+0

我更新了答案。 – vadian

+0

令人惊叹!非常感谢几年前的帮助和原始答案:) – user3225395