From the Mac Automation Scripting Guide, listing 21-20 (https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/ManipulateListsofItems.html#//apple_ref/doc/uid/TP40016239-CH48-SW1) is an example handler to find the location of a sting in an AppleScript List:
on getPositionOfItemInList(theItem, theList)
repeat with a from 1 to count of theList
if item a of theList is theItem then return a
end repeat
return 0
end getPositionOfItemInList
If I use this Handler in the following test AppleScript (Note: I have multiple "log" calls to identify various variables and their class. See results):
on getPositionOfItemInList(theItem, theList)
log (the class of theItem) & "- theItem-" & theItem
repeat with position from 1 to count of theList
if item position of theList is equal to theItem then return position -- "is" or "is equal to" or "=" are all equivalent
end repeat
return 0
end getPositionOfItemInList
set NAS_Names to {"Time Machine NAS", "Share Drives NAS"} -- Initialise the Disk names
set selectedNAS_List to choose from list NAS_Names with prompt "Choose NAS drive/s to wake up" with multiple selections allowed
set pass to 0
repeat with selectedNAS in selectedNAS_List
set pass to pass + 1
log "Pass # " & pass
log (the class of selectedNAS) & "- the class of selectedNAS-" & selectedNAS
log getPositionOfItemInList(selectedNAS, NAS_Names) & "- the item position in the list"
end repeat
Results in the following:
tell application "Script Editor"
choose from list {"Time Machine NAS", "Share Drives NAS"} with prompt "Choose NAS drive/s to wake up" with multiple selections allowed
--> {"Time Machine NAS"}
end tell
(Pass # 1)
(text, - the class of selectedNAS-, Time Machine NAS)
(text, - theItem-, Time Machine NAS)
(0, - the item position in the list) -- I.E., no match found
However:
If I change the Handler to:
on getPositionOfItemInList(theItem as text, theList)
or
if item position of theList is equal to theItem as text then return position
or
if item position of theList contains theItem then return position
or
if (offset of theItem in (item position of theList)) is equal to 1 then return position
Alternatively, if the call to the handler is changed to:
getPositionOfItemInList(selectedNAS as text, NAS_Names)
or
set selectedNAS to selectedNAS as text
before the call to the handler
Then the Handler works fine and finds the text string in the list, see the example below:
on getPositionOfItemInList(theItem, theList)
log (the class of theItem) & "- theItem-" & theItem
repeat with position from 1 to count of theList
if item position of theList is equal to theItem as text then return position
end repeat
return 0
end getPositionOfItemInList
set NAS_Names to {"Time Machine NAS", "Share Drives NAS"} -- Initialise the Disk names
set selectedNAS_List to choose from list NAS_Names with prompt "Choose NAS drive/s to wake up" with multiple selections allowed
set pass to 0
repeat with selectedNAS in selectedNAS_List
--set selectedNAS to selectedNAS as text
set pass to pass + 1
log "Pass # " & pass
log (the class of selectedNAS) & "- the class of selectedNAS-" & selectedNAS
log getPositionOfItemInList(selectedNAS, NAS_Names) & "- the item position in the list"
end repeat
Results in:
tell application "Script Editor"
choose from list {"Time Machine NAS", "Share Drives NAS"} with prompt "Choose NAS drive/s to wake up" with multiple selections allowed
--> {"Time Machine NAS"}
end tell
(Pass # 1)
(text, - the class of selectedNAS-, Time Machine NAS)
(text, - theItem-, Time Machine NAS)
(1, - the item position in the list) -- I.E., match found
My question is, why is it necessary to coerce what appears to be a text string to text? The result from "choose from list" is a list. However, the result of the "repeat with -- in" appears to be a text string, not a list according to the log output of its class. So why, for this handler to work correctly, does the result from the "repeat with" have to be coerced to text with the "as text"?
Is this just a strange quirk of AppleScript? Is the "repeat with -- in" not extracting a text string but something else that is not identified by the "class of" command, hence needing to be coerced?
Even though I have this handler working, I would love to know the answer. Thanks in advance.