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