将AppleScript对象存储在NSMutableDictionary

时间:2019-01-08 15:43:06

标签: applescript applescript-objc

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

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

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的包装类允许将其存储在NSMutableDictionary中?也许我可以推出自己的适用于pres的Objective-C代码?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

AppleScript的reference类型未桥接到ObjC,因此无法直接越过桥接。您可以将其包装在script对象中(只要该对象继承自NSObject),然后将其传递过来,尽管根据过去的经验,我发现创建和使用大量的桥接脚本对象也会使ASOC崩溃。

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