5
|
Todd Ditchendorf · 技术社区 · 15 年前 |
1
3
没错——NSDictionary和AppleScript记录看起来好像是混合在一起的,但实际上它们并没有(NSDictionary使用对象键,比如字符串),而AppleScript记录使用四个字母的字符代码(多亏了AppleEvent/Classic Mac OS的传统)。 看见 this thread on Apple's AppleScript Implementer's mailing list 因此,在您的例子中,您实际需要做的是解压缩您拥有的AppleScript记录并将其翻译到您的NSDictionary中。您可以自己编写代码,但这很复杂,而且需要深入AE经理。 然而,这项工作实际上已经在一些用于 appscript/appscript-objc 代码是 available on sourceforge . 几周前,我向作者提交了一个补丁,这样您就可以构建AppScript Objc的底层基础,这就是您需要的所有情况:您需要做的是打包和解压Apple脚本/ Apple事件记录。 对于其他谷歌用户,还有另一种方法可以做到这一点,那就是不使用appscript: ToxicAppleEvents . 其中有一种方法可以将字典翻译成苹果事件记录。 |
2
7
Cocoa将无缝转换
这个
Table 1-1 Cocoa脚本指南简介 "
当然,一个值本身可以是另一个嵌套记录,只需定义一个
好吧,让我们试试完整的样品。让我们在下面的示例中定义一个简单的HTTPGET命令
现在我们需要在Obj-C中实现这个非常简单的命令:
当然,回来
最后,我们需要一些AS代码来测试它:
结果:
但是等等,你想反过来,对吗?好吧,我们也来试试。我们只是重复使用我们的类型并发出另一个命令:
我们也执行了这个命令:
她是我们的应用程序登录到控制台的内容:
好吧,你现在可能会抱怨这不是真的 任意的 毕竟,您需要定义哪些键(可能)存在,以及如果它们存在,它们将具有什么类型。你是对的。然而,通常数据不是任意的,我的意思是,毕竟代码必须能够理解它,因此它至少必须遵循某种规则和模式。 如果您真的不知道需要什么样的数据,例如,像一个转储工具,只在两种定义良好的数据格式之间转换,而不了解数据本身,那么为什么要将其作为记录传递呢?为什么不将该记录转换为易于解析的字符串值(例如属性列表、JSON、XML、CSV),然后将其作为字符串传递,最后将其转换回对象?这是一个非常简单但非常强大的方法。在Cocoa中解析属性列表或JSON可能需要四行代码。好吧,这可能不是最快的方法,但无论谁在一句话中提到AppleScript和high performance都已经犯了一个根本性的错误;AppleScript当然可能很多,但“快”并不是您可以期望的属性。 |
3
3
to use a record definition 正如在另一个答案中提到的,该答案也有助于链接到苹果的文档,而我本人至少完全没有从脚本指南中找到这些文档。
如果上述要求由于任何原因不符合您的需要,则另一种解决方案是实施
我可以确认使用+scriptingRecordWithDecriptor:和同等类型的自定义命令对我有效。 |
4
0
2016年9月11日,Mac OS 10.11.6 AppleScript记录使用AppleScript属性作为键,使用数字或字符串作为值。 NSDictionary将相应的cocoa键用作AppleScript记录中四种最基本类型的键(以NSString对象的形式)和NSNumber或NSString值:string、integer、double和boolean。 针对+(id)scriptingRecordWithDescriptor:(NSAppleEventDescriptor*)索引的建议解决方案在我的案例中不起作用。 我的实现的基本变化是AppleScript环境中的每个类都定义自己的属性和AppleScript代码。要确定的键对象是NSScriptClassDescription,其中包含AppleScript代码和Cocoa键之间的关系。 另一个复杂问题是,在方法中用作参数的NSAppleEventDescriptor表示传入的AppleScript记录(在我的例子中是记录列表)。此NSAppleEventDescriptor可以有不同的形式。 AppleScript记录中的一个条目是特殊的:{class:“script class name”}。代码测试它的存在。 该方法在NSDictionary上实现为一个类别
|