AppleScript 从选择的列表对象类型中进行选择

问题描述 投票:0回答:2

自从我接触 AppleScript 以来已经很长时间了,所以这可能是我没有做正确的事情。我有一个通过收集路径中倒数第二个文本项来创建的列表。路径看起来像这样:

HD:用户:xxxxxxxx:库:开发人员:Xcode:档案:2017-06-14:焦点 6-14-17,8.03 AM.xcarchive:“

因此列表中填充了如下所示的字符串:

关注2017年6月14日上午8点30分.xcarchive

然后我向用户展示并要求他们选择一个存档。我有另一个包含所有存档路径的列表。我想要做的是获取选定的存档,在存档名称列表中找到它的索引,然后从存档路径列表中提取路径。非常简单,至少我这么认为。代码的相关部分如下所示:

set myFile to choose from list archiveFileNames with prompt "Select An Archive"
    -->return class of myFile
    
    repeat with i from 1 to count of every item of archiveFileNames
        
        if (myFile is equal to (item i of archiveFileNames as string)) then
            log myFile & "::" & item i of archiveFileNames & "::" & i
        end if
    end repeat

我从未获得匹配,即使我只是重复存档名称列表并使用日志语句,我也可以获得我正在寻找的结果:

log myFile & "::" & item i of archiveFileNames & "::" & i

(查看最后比赛结果)

(*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-1-17, 1.40 PM.xcarchive, ::, 1*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-1-17, 10.48 AM.xcarchive, ::, 2*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-1-17, 11.04 AM.xcarchive, ::, 3*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-1-17, 11.24 AM.xcarchive, ::, 4*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-1-17, 9.37 AM.xcarchive, ::, 5*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-3-17, 2.01 PM.xcarchive, ::, 6*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-3-17, 2.02 PM.xcarchive, ::, 7*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-5-17, 2.51 PM.xcarchive, ::, 8*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-12-17, 8.49 AM.xcarchive, ::, 9*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-12-17, 8.53 AM.xcarchive, ::, 10*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 5-16-17, 11.43 AM.xcarchive, ::, 11*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-5-17, 1.42 PM.xcarchive, ::, 12*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-6-17, 10.37 AM.xcarchive, ::, 13*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-6-17, 4.09 PM.xcarchive, ::, 14*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-13-17, 4.01 PM.xcarchive, ::, 15*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-14-17, 11.36 AM.xcarchive, ::, 16*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-14-17, 8.00 AM.xcarchive, ::, 17*)
    (*focus 6-14-17, 8.03 AM.xcarchive, ::, focus 6-14-17, 8.03 AM.xcarchive, ::, 18*)

所以我认为这一定是一个类/类型问题,其中不存在平等,因为我正在比较苹果和橙子。当我运行它并取消注释 --> myFile 的返回类时,我发现我从列表中选择的类是一个列表。

显然我做错了什么。我期望类型是字符串,也许是文本,而不是列表。

编辑

好的,所以如果我将条件更改为:

if (myFile is equal to (item i of archiveFileNames as **list**)) then

我得到了预期的结果。但我仍然很困惑为什么从字符串列表中选择的对象类型是列表。

applescript
2个回答
2
投票

尝试使用插件更改类型

as text

所以不要比较

if A is B

对于不同的类可能会失败 - 强制文本

if (A as text) is (B as text)

此外,这里还有一个处理程序,用于获取列表中的项目位置

on list_position(this_item, this_list)
    repeat with i from 1 to the count of this_list
     if ((item i of this_list) as text) is (this_item as text) then return i
     end repeat
return 0
end list_position

编辑:为了澄清您的列表问题,请说明您如何创建列表


1
投票

出现此问题的原因是

choose from list
始终返回对象的 list(如果用户按
Cancel
,则返回布尔值 false)。

你必须压平列表。

set myFile to choose from list archiveFileNames with prompt "Select An Archive"

if myFile is false then return
set myFile to item 1 of myFile
repeat with i from 1 to count of every item of archiveFileNames
    set currentItem to item i of archiveFileNames
    if myFile = currentItem then
        log myFile & "::" & currentItem & "::" & i
    end if
end repeat
© www.soinside.com 2019 - 2024. All rights reserved.