Как я могу запустить JXA из Swift?

Если у меня есть строковая переменная с исходным кодом JXA, есть ли способ запустить ее из swift? Кажется, NSApleScript работает только с исходным кодом AppleScript.


person jl303    schedule 26.05.2017    source источник


Ответы (2)


Вот пример, показывающий, как использовать OSAKit из Swift для запуска сценария JavaScript для автоматизации, хранящегося в строке:

import OSAKit
let scriptString = "Math.PI";
let script = OSAScript.init(source: scriptString, language: OSALanguage.init(forName: "JavaScript"));
var compileError : NSDictionary?
script.compileAndReturnError(&compileError)
if let compileError = compileError {
    print(compileError);
    return;
}
var scriptError : NSDictionary?
let result = script.executeAndReturnError(&scriptError)
if let scriptError = scriptError {
    print(scriptError);
}
else if let result = result?.stringValue {
    print(result)
}

Этот код Swift был адаптирован из исходного кода Hammerspoon (Objective-C ).

person bacongravy    schedule 15.03.2018

Почему? JXA — собака во всех отношениях. Если вы просто хотите запустить код JS, API JavaScriptCore Obj-C намного чище и проще. Если вы хотите управлять приложениями «AppleScriptable», используйте AppleScript — это единственный официально поддерживаемый† вариант, который работает правильно.

(† Существует SwiftAutomation, но Apple не укусила, и я не склонен поддерживать ее сам, учитывая хроническое неумелое управление Apple Mac Automation. Посмотрим, что произойдет с WWDC17.)

person has    schedule 27.05.2017
comment
Я уже сделал множество сценариев JXA, поэтому я хотел бы иметь возможность выполнять их из Swift. Если Swift не может этого сделать, я думаю, единственный способ запустить оболочку с osascript через swift? - person jl303; 27.05.2017
comment
Есть OSAKit, но он недокументирован, так что вам придется разбираться с ним самостоятельно. Или просто сохраните свои скрипты в формате .scpt, которые будут запускаться NSAppleScript/NSUserAppleScriptTask. (Каждая компиляция из исходного кода сама по себе является запахом кода; обычное дело в наивном/небезопасном коде, который параметризует скрипты с помощью перебора строк кода вместо того, чтобы передавать их в качестве параметров обработчику run скрипта.) Кстати, еще одно преимущество AppleScript заключается в том, что AppleScriptObjC вызывать обработчики AS непосредственно из ObjC/Swift, как если бы они были нативными методами; значительно менее болезненно. - person has; 28.05.2017