2 votos

¿Cómo puedo bucle a través de los resultados de un AppleScript para encontrar las variables que tienen un valor booleano de 1?

Estoy usando Applescript con Pashua: Nativo macOS los cuadros de diálogo para lenguajes de secuencias de comandos. Estoy utilizando las casillas de verificación en el cuadro de diálogo, y puedo conseguir la salida de ellos como consecuencia de ello, en el editor de secuencias de comandos, es decir, cuando cat y cat 2 se comprueban, me sale:

{cat:"1", cat4:"0", cat2:"1", cat3:"0"}

Pero lo que necesito es un bucle a través de las casillas de verificación para buscar sólo aquellos que se han ajustado a 1, y no sé por dónde empezar.

¿Cómo puedo bucle a través de todas las categorías - cat, cat2, cat3, cat4, etc. - en el resultado, buscar sólo aquellos que son boolean 1, y la salida a los de una variable, separados por una coma.

I. e. el uso de este script resultado

{cat:"1", cat4:"0", cat2:"1", cat3:"0"}

¿cómo puedo recorrer y obtener una variable que tiene un valor de:

cat1, cat2


Este es el script que genera el cuadro de diálogo y las casillas de verificación:

tell application "Finder" to set thisFolder to (container of (path to me)) as text -- get the folder path
try
    set thePath to alias (thisFolder & "Pashua.scpt")
    set pashuaBinding to load script thePath

    tell pashuaBinding
        try
            set dialogConfiguration to my getDialogConfiguration() -- configure the dialog
            set dialogResult to showDialog(dialogConfiguration, "") -- show the dialog

        end try
    end tell
end try

on getDialogConfiguration() -- return the configuration string
    return "

# Add category checkboxes
txtcats.type = text
txtcats.default = Categories
cat.rely = -18
cat.type = checkbox
cat.label = Category 1
cat2.type = checkbox
cat2.label = Category 2
cat3.type = checkbox
cat3.label = Category 3
cat4.type = checkbox
cat4.label = Category 4

"
end getDialogConfiguration

1voto

qarma Puntos 71

AppleScript records son un mal implementado construir, apareciendo a emular lo que se conoce en algunos idiomas como un array asociativo, pero haciendo un medio arsed trabajo de la misma.

Lo que se conoce como properties en record, es decir, cat, cat4, etc. en su caso, no son cosas que se puede hacer referencia indirectamente, por lo tanto no es posible leer los valores y almacenarlos en una variable a través de la cual se puede acceder al registro de elemento asociado con la propiedad.

En otras palabras, uno no puede hacer ninguna de estas:

set R to {cat:"1", cat4:"0", cat2:"1", cat3:"0"}

set item_name to cat  # Error: the variable cat is not defined
return item_name of R

set item_name to "cat"
return item_name of R # Error: can't get item_name of {cat:"1", ...}

set item_name to a reference to cat
return item_name of R # [ As above ]

Usted puede, por supuesto, hacer esto:

set item_value to cat of R

pero eso requiere que usted ya tiene una conciencia de la property nombre "cat".


La forma más sencilla de evitar este problema es lanzar la AppleScript record a un tipo de datos diferente de la otra lengua que le da acceso completo a la relación asociativa entre los pares de entradas.

Sus dos opcións son Objective-C , y JavaScript:

AppleScript-ObjC

AppleScript records puente a lo que Objective-C y muchos otros idiomas, se refieren a como dictionaries, los cuales son, para todos los intentos y propósitos para nosotros-de la misma como arrays asociativos (se diferencian por la campana en cómo se almacenan los datos y acceder, pero esto hace poca diferencia para nosotros).

Necesitamos transformar el AppleScript record a un Objetivo-C NSDictionary el objeto de la clase, entonces podemos buscar a través de sus claves (lo que fue conocido anteriormente como propiedades) y los valores de forma indiscriminada:

use framework "Foundation"

property this : a reference to the current application
property NSDictionary : a reference to NSDictionary of this


set R to {cat:"1", cat4:"0", cat2:"1", cat3:"0"} # Swap in the return value of your script

set D to NSDictionary's dictionaryWithDictionary:R
return (D's allKeysForObject:"1") as list 
    --> {"cat", "cat2"}

Si se quiere meter esto en una función a utilizar para buscar algún valor arbitrario en algunos arbitraria record, entonces:

on keys from R as record given data:V : missing value
    local R, V

    script
        use framework "Foundation"
        property this : a reference to current application
        property nil : a reference to missing value
        property dict : a reference to NSDictionary of this

        property object : R
        property value : V

        on fn()
            tell (dict's dictionaryWithDictionary:object)
                if value = nil then return ¬
                    allKeys() as list
                allKeysForObject_(value) as list
            end tell
        end fn
    end script

    result's fn()
end keys

Entonces:

return the keys from {cat:"1", cat4:"0", cat2:"1", cat3:"0"}

volverá {"cat", "cat4", "cat2", "cat3" }, es decir, todas las claves, y

return the keys from {cat:"1", cat4:"0", cat2:"1", cat3:"0"} given data:"0"

devolverá sólo los que están asociados con el valor de "0".

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