Swift/Objective-C/Applescript 项目中无法识别的选择器
Unrecognized Selector in Swift/Objective-C/Applescript project
当 运行 这个简单的 ASObjc 程序与 Swift 交互时,我收到以下消息:
*** -[ASMyObject foo:]: unrecognized selector sent to object <ASMyObject @0x60c000226fe0: OSAID(4) ComponentInstance(0x810000)>
如果我从 foo
中删除参数,代码将按预期工作。我意识到我使用参数创建 foo
的方式一定有问题。
这是代码,基于 :
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"
您必须添加一个下划线字符来表示 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
当 运行 这个简单的 ASObjc 程序与 Swift 交互时,我收到以下消息:
*** -[ASMyObject foo:]: unrecognized selector sent to object <ASMyObject @0x60c000226fe0: OSAID(4) ComponentInstance(0x810000)>
如果我从 foo
中删除参数,代码将按预期工作。我意识到我使用参数创建 foo
的方式一定有问题。
这是代码,基于
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"
您必须添加一个下划线字符来表示 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