如何从Swift运行JXA?

如何从Swift运行JXA?,swift,javascript-automation,Swift,Javascript Automation,如果我有一个带有JXA源代码的字符串变量,有没有办法从swift运行它?NSAppleScript似乎只适用于AppleScript源代码。为什么?JXA在各个方面都是一只狗。如果您只想运行JS代码,JavaScriptCore Obj-CAPI将更加干净和简单。如果您想控制“AppleScriptable”应用程序,请使用AppleScript,这是唯一官方支持的†正确选项 (†有SwiftAutomation,但苹果还没有咬人,鉴于苹果对Mac Automation的长期管理不善,我本人也不

如果我有一个带有JXA源代码的字符串变量,有没有办法从swift运行它?NSAppleScript似乎只适用于AppleScript源代码。

为什么?JXA在各个方面都是一只狗。如果您只想运行JS代码,JavaScriptCore Obj-CAPI将更加干净和简单。如果您想控制“AppleScriptable”应用程序,请使用AppleScript,这是唯一官方支持的†正确选项


(†有SwiftAutomation,但苹果还没有咬人,鉴于苹果对Mac Automation的长期管理不善,我本人也不倾向于支持它。我们来看看WWDC17会发生什么。)

为什么?JXA在各个方面都是一只狗。如果您只想运行JS代码,JavaScriptCore Obj-CAPI将更加干净和简单。如果您想控制“AppleScriptable”应用程序,请使用AppleScript,这是唯一官方支持的†正确选项


(†有SwiftAutomation,但苹果没有咬人,鉴于苹果对Mac Automation的长期管理不善,我本人也不倾向于支持它。我们将看看WWDC17会发生什么。)

以下是一个示例,展示如何使用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代码改编自

,下面是一个示例,演示如何使用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代码改编自

我已经制作了大量JXA脚本,因此我希望能够从Swift执行。若斯威夫特不能做到这一点,我想唯一的办法就是通过斯威夫特用osascript运行shell?有OSAKit,但它并没有文档记录,所以你们必须自己去弄清楚。或者只需将脚本保存为
.scpt
格式,即可运行
NSAppleScript
/
nsusapplescripttask
。(每次从源代码编译本身就是一种代码味道;在通过代码字符串搜索而不是将脚本作为参数传递给脚本的
run
handler)来参数化脚本的幼稚/不安全代码中很常见。)顺便说一句,AppleScript的另一个好处是AppleScriptObjC可以作为处理程序调用,就好像它们是本机方法一样;我已经编写了大量的JXA脚本,所以我希望能够从Swift执行。若斯威夫特不能做到这一点,我想唯一的办法就是通过斯威夫特用osascript运行shell?有OSAKit,但它并没有文档记录,所以你们必须自己去弄清楚。或者只需将脚本保存为
.scpt
格式,即可运行
NSAppleScript
/
nsusapplescripttask
。(每次从源代码编译本身就是一种代码味道;在通过代码字符串搜索而不是将脚本作为参数传递给脚本的
run
handler)来参数化脚本的幼稚/不安全代码中很常见。)顺便说一句,AppleScript的另一个好处是AppleScriptObjC可以作为处理程序调用,就好像它们是本机方法一样;大大减轻了痛苦。