将 AppleScript 对象存储在 NSMutableDictionary 中

Store AppleScript object in NSMutableDictionary

作为自动化工作流程的一部分,我希望能够在 NSMutableDictionary 中存储对 applescript 对象的引用。实际上,这样做是为了能够使用变量名。使 NSAppleScript 实例保持活动状态,然后我就可以参考以前的结果并从我离开的地方继续。

具体来说,我想在 NSMutableDictionary 中存储一个 Presentation 对象 (Microsoft PowerPoint)。

use framework "Foundation"
property memory : null
set memory to current application's NSMutableDictionary's dictionary()

-- function to get a ref to a presentation based on either a NAME or a PATH
on getPresentation(desc)
    tell application "Microsoft PowerPoint"
        if (item 1 of desc) is "" then
            return item 1 of (get presentations whose path is (item 2 of desc))
        else
            return item 1 of (get presentations whose name is (item 1 of desc))
        end if
    end tell
end getPresentation

-- Fetch a currently open presentation (just an example)
-- this exists if you open a new presentation in PPT (no saving) and enter as title test
set pres to getPresentation({"test [Autosaved]", null})

memory's setObject:pres forKey:"presentation"

这将引发以下错误: error "Can’t make «class pptP» 2 of application \"Microsoft PowerPoint\" into the expected type." number -1700 from «class pptP» 2

我希望能够存储对象 pres 以供将来使用,从包含的 Objective-C 代码中引用它(通过 NSAppleScript,根据需要通过包装器调用 pres 上的方法)。我可以告诉 applescript 将某个处理程序的结果存储在某个地址并在以后使用它。

我试过使用 a reference to pres 来解决问题,但没有成功。

有办法解决吗?也许在 pres 周围包装 class 允许它存储在 NSMutableDictionary 中?或许我可以推出自己的 Objective-C 代码来在 pres 上运行?

如有任何帮助,我们将不胜感激!

AppleScript 的 reference 类型未桥接至 ObjC,因此无法直接通过桥接。您可以将它包装在一个 script 对象中(只要该对象继承自 NSObject)并将其传递过去,尽管在过去的经验中我发现创建和使用大量桥接脚本对象也会导致 ASOC碰撞。

最简单的解决方案是在 AS 端保留 AS 引用,并将它们存储在本地数据结构中,例如键值列表、二叉树或哈希列表。 (例如,我的旧 Objects library 提供相当快的 DictionaryCollection(哈希列表)对象正是出于这个原因而创建的。)