3 votos

AppleScript: obtener todos los elementos de A cuyo B esté en {1, 2, 3, 4}

Estoy bastante seguro de que mi pregunta es sólo una cuestión de sintaxis general, pero incluyendo el contexto específico en caso de que sea relevante:

Hay una aplicación para Mac llamada SwitchResX que te permite hacer cosas interesantes como crear y utilizar resoluciones personalizadas en monitores Mac. Tiene un proceso en segundo plano llamado "SwitchResX Daemon" que es AppleScriptable.

Entre otras cosas:

  • application (clase) tiene uno o más display elementos
  • display (clase) tiene uno o más mode elementos
  • mode (clase) tiene propiedades como height , width (números enteros) , frequency (real) , valid (booleano) etc.

Tengo dos problemas relacionados:

Problema 1: de quién/dónde es X en {...}

tell application "SwitchResX Daemon"
    set theDisplay to the second display

    set theModes1 to theDisplay's every mode where it is valid and ((its width is 3008) or (its width is 2560)) --> {mode 8 of display 2, mode 12 of display 2} = expected and desired result

    set theModes2 to theDisplay's every mode where it is valid and (its width is in {3008, 2560}) --> …error: Can’t make {3008, 2560} into type specifier.

end tell

Utilizo if afirmaciones como if width is in {3008,2560} then ... mucho. ¿Puede el is in {...} no debe utilizarse en un whose / where ¿o me equivoco de sintaxis?

Problema 2: Tengo la necesidad de dividir el filtrado en al menos una situación. Entonces...

tell application "SwitchResX Daemon"
    set theDisplay to the second display

    set theModesAllValid to theDisplay's every mode where it is valid --> {……, mode 8 of display 2, mode 12 of display 2, ……} = expected and desired result

    set someModes1 to theModesAllValid's first item where ((its width is 3008) or (its width is 2560)) --> mode 8 of display 2 = expected and desired result
    set someModes2 to theModesAllValid's first item where (its width is in {3008, 2560}) --> same error as problem 1 above
    set someModes3 to theModesAllValid's every item where ((its width is 3008) or (its width is 2560)) --> error noted below**
    set someModes4 to theModesAllValid's every item where (its width is in {3008, 2560}) --> error noted below**
end tell

-- **error = "Can’t get {……, mode 8 of display 2 of application "SwitchResX Daemon", mode 12 of display 2 of application "SwitchResX Daemon", ……} whose width of it = 3008 or width of it = 2560."

Así que someModes1 (utilizando first item en lugar de every item ) funciona de forma similar a theModes1 en el Problema 1 (excepto item en lugar de list, como era de esperar). Y someModes2 da el mismo error que theModes2 (así, coherente al menos).

Pero entonces esperaría someModes3 y someModes4 para dar los mismos resultados que el problema 1, pero aquí el every lo rompe de alguna manera. ¿Por qué? E incluso si no hay solución al problema 1 (es decir someModes4 no funcionará), ¿hay alguna forma de dividir el filtrado en dos pasos para alguna derivada de someModes3 a trabajar?

Gracias de antemano por cualquier ayuda.

1voto

sqlbelle Puntos 296

Hace 15 años que no me meto con AppleScript y no tengo SwitchResX, pero aquí van algunas pistas:

  1. "No se puede convertir {3008, 2560} en especificador de tipo".

    set theModes2 to theDisplay's every mode where it is valid and (its width is in {3008, 2560})

AppleScript es raro porque nunca puedes saber si se espera que funcione normalmente, si podría funcionar si los desarrolladores hicieran esfuerzos heroicos, o si es totalmente imposible. Los desarrolladores de aplicaciones tienen un margen de maniobra decente a la hora de implementar y también de implementar a medias sus diccionarios de aplicaciones.

Por lo tanto, siempre es un montón de ensayo y error para hacer que un AppleScript funcione.

En is in funciona de forma diferente dentro de un tell . ¡LOL! Esperabas que detectara la presencia de un elemento en una lista, como lo hace fuera de un tell .

Dentro de un tell No creo is in suele funcionar como se espera aquí. No estoy seguro de si se podría hacer que funcionara así si un desarrollador de aplicaciones se esforzara lo suficiente. Me gustaría que funcionara así, si no recuerdo mal.

He aquí un ejemplo is in trabaja en el interior tell :

tell application "Google Chrome"
    get first window where "Apple" is in its tabs's title
end tell
  1. Operación en dos partes

No sé muy bien lo que estás intentando hacer aquí en última instancia, pero quizá el fragmento anterior pueda darte algunas pistas sobre cómo puedes conseguirlo en una o dos sentencias.

En cualquier caso, parece un error de la aplicación:

set someModes3 to theModesAllValid's every item where ((its width is 3008) or (its width is 2560))

C.f.:

tell application "Google Chrome"
    tell first window
        every tab where its title is "Google" or its title is "Apple"
    end tell
end tell

De todos modos, aunque every no funciona, puedes hacer un bucle a través de cada condición. Un gran desastre al escribir AppleScript es dedicar cualquier tipo de tiempo a preocuparse por la eficiencia. ¡Estás usando AppleScript! Haz que funcione y sigue adelante :)

Avíseme si puedo aclararle algo más.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X