如果我有一个包含JXA源代码的字符串变量,是否有办法从Swift中运行它?似乎NSAppleScript仅适用于AppleScript源代码。
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)改编而来的。
为什么?JXA在各方面都很糟糕。如果你只想运行JS代码,JavaScriptCore Obj-C API更加干净和容易。如果你想控制“可用AppleScript”的应用程序,则使用AppleScript-它是唯一官方支持的†正确工作的选项。
(†虽然有SwiftAutomation,但苹果公司还没有采用,考虑到苹果公司对Mac自动化的严重管理不善,我不倾向于自己支持它。我们将看看WWDC17会发生什么。)
.scpt
格式,然后使用NSAppleScript
/NSUserAppleScriptTask
运行即可。(每次从源代码编译都是一种代码异味;在通过代码字符串混淆参数化脚本而不是将它们作为参数传递给脚本的“run”处理程序的天真/不安全代码中很常见。)顺便说一句,AppleScript的另一个好处是,可以使用AppleScriptObjC直接从ObjC/Swift调用AS处理程序(http://appscript.sourceforge.net/asoc.html),就像它们是本地方法一样;大大减轻了痛苦。 - has