我该如何在Swift中运行JXA?

6
如果我有一个包含JXA源代码的字符串变量,是否有办法从Swift中运行它?似乎NSAppleScript仅适用于AppleScript源代码。
2个回答

7
以下是一个示例,展示如何使用Swift中的OSAKit来运行存储在字符串中的JavaScript for Automation脚本:
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)改编而来的。


-5

为什么?JXA在各方面都很糟糕。如果你只想运行JS代码,JavaScriptCore Obj-C API更加干净和容易。如果你想控制“可用AppleScript”的应用程序,则使用AppleScript-它是唯一官方支持的†正确工作的选项。

(†虽然有SwiftAutomation,但苹果公司还没有采用,考虑到苹果公司对Mac自动化的严重管理不善,我不倾向于自己支持它。我们将看看WWDC17会发生什么。)


我已经编写了大量的JXA脚本,因此我想能够从Swift执行。如果Swift不能做到,我猜唯一的方法是通过Swift运行带有osascript的shell? - jl303
1
有OSAKit,但它没有文档,所以你必须自己弄清楚。或者只需将脚本保存为.scpt格式,然后使用NSAppleScript/NSUserAppleScriptTask运行即可。(每次从源代码编译都是一种代码异味;在通过代码字符串混淆参数化脚本而不是将它们作为参数传递给脚本的“run”处理程序的天真/不安全代码中很常见。)顺便说一句,AppleScript的另一个好处是,可以使用AppleScriptObjC直接从ObjC/Swift调用AS处理程序(http://appscript.sourceforge.net/asoc.html),就像它们是本地方法一样;大大减轻了痛苦。 - has

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接