Swift NSScriptCommand executeDefaultImplementation
Я использовал этот код в Objective C:
@implementation KDOrderInfo
- (id)performDefaultImplementation {
NSString *theRequest = [self directParameter];
NSDictionary *arguments = [self evaluatedArguments];
NSLog(@"arguments = %@ %ld",arguments, [arguments count]);
NSLog(@"theRequest----> %@",theRequest);
/*.......
.....*/
return @YES
}
Этот код работает хорошо в Objective C. Я преобразовал этот код в код Swift следующим образом:
class OrderInfo : NSScriptCommand {
override func performDefaultImplementation() -> AnyObject! {
let theRequest: AnyObject! = self.directParameter
let arguments = self.evaluatedArguments
println("arguments = \(arguments) argumentsCount = \(arguments.count)")
println("theRequest----> \(theRequest)")
/*.......
.....*/
return "OK"
}
}
когда я запускаю мой appleScript, тогда я получаю ошибку (InfoMaker - название моего приложения): InfoMaker получил ошибку: обработчик некоторого объекта не определен.
Метод:
override func application(theApp:NSApplication,delegateHandlesKey theKey:String) -> Bool{
println("scripting key = \(theKey)");
let thekeys = ["pathToXML", "saveXMLFlag", "webserviceName","methodName","pathToInfoFiles","fileToCheck","scriptingProperties"]
if thekeys.containsString(theKey.lowercaseString, searchcase:NSStringCompareOptions.CaseInsensitiveSearch) {
//[self prefsToVars];
println("YES")
return true;
} else {
println("NO")
return false
}
}
в моем приложении делегат отвечает ОК на appleScript.
Я попытался также с примером "SimpleScriptingVerbs" от Apple, и я получил ту же ошибку в моей реализации Swift. Я надеюсь, что кто-то может помочь найти проблему и предложить.
2 ответа
Тем временем я смог найти решение проблемы и заставить приложение работать с командами сценария.
Имя класса какао для вашей команды, которое вы должны указать в файле определения скрипта (.sdef
) не совпадает с именем класса в XCode (Swift), как в случае Objective-C.
Вместо этого вы должны добавить имя / модуль проекта к классу следующим образом: MyProject.MySwiftCommandClassName
Если вы сомневаетесь в правильности имени в своем классе Swift, вы можете использовать следующий код, чтобы получить правильное имя для использования в своем классе. .sdef
файл:
class func classString() -> String {
return NSStringFromClass(self)
}
Ваш .sdef
файл может выглядеть примерно так:
<dictionary title="MyAp">
<suite name="MyAp Suite" code="MyAp" description="MyAp Scripts">
<command name="myCommand" code="MyApMyCm" description="...">
<cocoa class="MyProject.MySwiftCommandClassName"/>
[...]
Если вы добавите @objc(OrderInfo) к определению класса, вам не нужно будет добавлять имя проекта.
@objc(OrderInfo) class OrderInfo : NSScriptCommand {