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