将 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
(哈希列表)对象正是出于这个原因而创建的。)
作为自动化工作流程的一部分,我希望能够在 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
(哈希列表)对象正是出于这个原因而创建的。)