1 votos

¿Cómo puedo añadir una ciudad a mi lista y crear la correspondiente cadena if-then?

Mi código actual:

property cityList : {"City A","City B","City C","New City"}
choose from list cityList with prompt "Choose your city:"
set choice to result
if choice is not false then set city to choice
if choice is false then error number -128

if (city as string) is "City A" then
    set lat to 1
    set lon to 1
else if (city as string) is "City B" then
    set lat to 1
    set lon to 1
else if (city as string) is "City C" then
    set lat to 1
    set lon to 1
else if (city as string) is "New City" then
    set lat to my customLat()
    set lon to my customLon()
    set city to my customCity()
    set x to the length of cityList
    set the end of cityList to "New City"
    copy city as string to item x of cityList
end if

--script that does things based on values of lat and lon

donde customLat() es una subrutina que pide al usuario una latitud, intenta forzarla a un número y da un error si no puede, y da otro error si dicho número no está entre -90 y 90, y customLon() es uno similar, pero en vez de eso comprueba entre -180 y 180. En cualquiera de los casos, si se produce un error, se solicita al usuario el número correspondiente una vez más. customCity() se limita a pedir al usuario el nombre de la ciudad.

Mi problema es qué escribir después del copy city línea. ¿Hay alguna forma de añadir un if en mi código - es decir, que el código se escriba sobre sí mismo - basado en el resultado de la "Nueva Ciudad" if bloque? Es decir, una vez que el código ha establecido las variables city , lat y lon se insertará antes del end if línea un bloque similar al de las ciudades anteriores:

else if (city as string) is "Newly Inputted City" then
    set lat to 1
    set lon to 1

Estoy buscando una manera de que el usuario pueda introducir una ciudad y coordenadas personalizadas, y el código se sobrescribe a sí mismo para permitirlo como opción válida, de modo que la próxima vez que se ejecute el script la ciudad personalizada estará disponible como opción, y al seleccionarla se establecerá automáticamente su lat y lon Al igual que las demás ciudades.

1voto

Andreas Scherer Puntos 161

Tu código no necesita reescribirse a sí mismo. else ya se encarga de todos los casos que están en paradero desconocido:

property cityList : {"City A", "City B", "City C", "New City"}
set choice to choose from list cityList with prompt "Choose your city:"
if choice is false then
    error number -128
end if

set city to choice as string
if city is "New City" then
    set lat to my customLat()
    set lon to my customLon()
    set city to my customCity()
    set x to the length of cityList
    set the end of cityList to "New City"
    copy city to item x of cityList
else
    set lat to 1
    set lon to 1
end if

1voto

Baczek Puntos 150

Añadir líneas a un script es posible, pero es muy complicado e innecesario.

Sólo necesitas dos listas, ciudades y coordenadas .

Simplemente utiliza un bucle para obtener el índice de la ciudad en la lista, y utiliza ese índice para obtener las coordenadas en la otra lista.

Aquí está el script:

property myRecord : {cityList:{"City A", "City B", "City C", "New City"}, coordinates:{{1, 1}, {1, 1}, {1, 1}}}

set choice to choose from list (cityList of myRecord) with prompt "Choose your city:"
if choice is false then error number -128
set city to item 1 of choice -- the class of choice is a list, this list contains one item

if city is "New City" then
    set lat to my customLat()
    set lon to my customLon()
    set city to my customCity()

    tell (cityList of myRecord)
        set last item to city -- replace the last item in the cityList
        set end to "New City" -- append "New City" to cityList
    end tell
    set end of (coordinates of myRecord) to {lat, lon} -- append a list in the 'coordinates' list

else -- the city is not "New City"
    tell myRecord
        set len to (length of its cityList) - 1 -- ***    -1 to skip the last item ("New City")   ****
        repeat with i from 1 to len
            if (item i of its cityList) = city then -- the index of the city in the 'cityList' is i
                set {lat, lon} to item i of its coordinates -- I use the index to get the latitude and the longitude in the 'coordinates' list
                exit repeat
            end if
        end repeat
    end tell
end if
log {lat, lon}
--script that does things based on values of lat and lon

Nota : Utilizo un registro en el script, pero puede utilizar dos propiedades si lo prefiere:

property cityList : {"City A", "City B", "City C", "New City"}
property coordinates : {{1, 1}, {1, 1}, {1, 1}}

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