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 {
Другие вопросы по тегам