我正在编写一个在iTunes中使用的Applescript,在某些时候我想从曲目列表中选择任何曲目,但我预期它的工作方式会产生错误。这是代码:
tell application "iTunes"
set thePlaylist to the first playlist whose name is "Missing track count"
-- ...
-- populate a list of strings: albumList
-- ...
repeat with albumName in the albumList
set theAlbum to (the tracks of thePlaylist whose album is albumName)
display dialog "Found " & (count theAlbum) & " tracks in the album"
set aTrack to some track of theAlbum -- ERROR OCCURS HERE
end repeat
end tell
从iTunes中执行脚本时出现的错误是:
无法获得«class cFlT»id 16112 of«class cUs?»id 15982 of«class cSrc»id 65的应用程序“iTunes”,...等等的«class cTrk»
现在,我真的不明白为什么它不起作用,虽然我想它必须与theAlbum中的项目是来自iTunes应用程序源的用户播放列表中的文件轨道这一事实有关。 '正义'曲目。任何人都可以帮助我吗?
答案 0 :(得分:1)
在此示例中,我使用some item
代替some track
,这可以正常工作。
tell application "iTunes"
set thePlaylist to the first playlist
set x to (the tracks of thePlaylist)
set aTrack to some item in x
end tell
结果
URL track id 87 of library playlist id 82 of source id 64 of application "iTunes"
由于示例中的所有项目都是从轨道继承的,因此我不知道它为什么不起作用,但事实并非如此。
答案 1 :(得分:0)
theAlbum
是一个列表,而不是播放列表,因此它没有跟踪元素;它只有items。
列表上的文档,其中声明“您还可以按类引用索引列表项”。是不完整的,因此具有误导性。看来你只能用内置类来做这件事。从我能收集到的,这就是原因:
Object specifiers(2)是based on key-value coding。 specifier might identify属性(对象属性或一对一关系)或元素(多对多关系)。在这个例子中,我们正在处理元素。要处理元素,底层的Objective-C类必须实现collection accessor pattern。也就是说,它必须implement at least -<key>
, or -countOf<Key>
and -objectIn<Key>AtIndex:
(当然,它可以实现所有这些)。 list类为一组Applescript类执行此操作(如果您查看列表类的ObjC源,则会找到countOfApplication
和-objectInNumberAtIndex:
等方法。可以想象,它可以使用适当的-doesNotRecognizeSelector:
处理程序支持任意元素对象说明符,但是列表似乎没有以这种方式实现。由于列表没有-track
,-countOfTrack
或-objectInTrackAtIndex:
处理程序,因此无法处理“first track of trackList
”等说明符。