【问题标题】:Error: Can't get some «class» of {«class», «class», ...}错误:无法获得 {«class», «class», ...} 的某些 «class»
【发布时间】:2010-11-08 09:22:34
【问题描述】:

我正在编写一个用于 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 cSrc» id 15982 of «class cSrc» id 65 of application "iTunes", ... 等的一些 «class cTrk»

现在,我真的不明白为什么它不起作用,尽管我想这一定与专辑中的项目是来自 iTunes 应用程序源的用户播放列表的文件轨道这一事实有关的“只是”轨道。有谁能帮帮我吗?

【问题讨论】:

  • aTrack 来自哪里?
  • 如果您提供了一个工作示例会很好。见下面我的。
  • 好的,抱歉。根据您的回复,我将示例简化为我困惑的本质。这有效:tell application "iTunes" to set aTrack to some track,但这不起作用:tell application "iTunes" to set aTrack to some track as track。为什么?
  • 您评论中的问题代码可以更简单:tell application "iTunes" to get some track as track。此示例的问题与问题中的不同。要将一个类强制转换为另一个类,应用程序必须定义一个coercion handler。显然,iTunes 没有定义从曲目到曲目的强制处理程序。这似乎并不少见:window 1 as window

标签: applescript


【解决方案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"

由于您示例中的所有项目都从轨道继承,我不知道为什么它不起作用,但它不起作用。

【讨论】:

  • 谢谢,虽然它没有回答我的问题,但它确实帮助了我。 (也许我问错了问题。)
【解决方案2】:

theAlbum 是一个列表,不是播放列表,所以它没有轨道元素;它只有items

关于列表的文档,其中声明“您还可以按类引用索引列表项”。是不完整的,因此具有误导性。看来您只能对内置类执行此操作。据我所知,原因如下:

Object specifiers (2) 是based on key-value codingspecifier might identify 属性(对象属性或一对一关系)或元素(一对多关系)。在示例中,我们正在处理元素。要处理元素,底层的 Objective-C 类必须实现 collection accessor pattern。也就是说,它必须implement at least -<key>, or -countOf<Key> and -objectIn<Key>AtIndex:(当然,它可以实现所有这些)。列表类为一组 Applescript 类执行此操作(如果您查看列表类的 ObjC 源代码,您会发现像 countOfApplication-objectInNumberAtIndex: 这样的方法)。可以想象,它可以通过适当的-doesNotRecognizeSelector: 处理程序支持任意元素对象说明符,但列表似乎没有以这种方式实现。由于列表没有-track-countOfTrack-objectInTrackAtIndex: 处理程序,它们无法处理诸如“first track of trackList”之类的说明符。

【讨论】:

  • 这没有意义,因为该错误明确指出该列表包含文件轨道,并且根据您引用的页面,“您还可以按类引用索引列表项”。
  • 更新是否更有意义?相关信息分散在 Apple 关于 Applescript 的文档中,但阅读这些文档并合并这些信息是值得的。
  • 另外,如果一位有权访问 AppleScript 源代码的 Apple 工程师碰巧读到了这篇文章,您能否证实我的怀疑(只要它不破坏任何 NDA)?
猜你喜欢
  • 2018-05-30
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2022-06-30
相关资源
最近更新 更多