¿Cómo puedo agregar una ciudad a mi lista y crear una cadena correspondiente de if-then?

1

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 solicita al usuario una latitud, intenta forzarla a un número y genera un error si no puede, y genera otro error si dicho número no está entre -90 y 90, y customLon() es similar, pero en su lugar se comprueba entre -180 y 180. En cualquier caso, si se devuelve un error, solicita al usuario el número relevante una vez más. customCity() simplemente le pide al usuario el nombre de la ciudad.

Mi problema es qué escribir después de la línea copy city . ¿Hay alguna manera de agregar un bloque if en mi código, es decir, tener el código escrito encima de sí mismo, basado en el resultado del bloque "nueva ciudad" if ? Es decir, una vez que el código haya establecido las variables city , lat y lon , insertará antes de la línea end if un bloque similar a las ciudades anteriores:

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

Estoy buscando una forma en que el usuario pueda ingresar una ciudad y coordenadas personalizadas, y el código se sobrescribirá para permitir que sea una opción válida, para que la próxima vez que se ejecute el script la ciudad personalizada estará disponible como una opción, y al seleccionarla se establecerá automáticamente su lat y lon , al igual que las otras ciudades.

    
pregunta DonielF 31.07.2017 - 20:13

2 respuestas

1

Tu código no necesita reescribirse. else ya se ocupa de todos los casos que no se tienen en cuenta:

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
    
respondido por el user11633 31.07.2017 - 23:34
1

Es posible agregar líneas a un script, pero es muy complicado e innecesario.

Solo necesitas dos listas, ciudades y coordenadas .

Simplemente use un bucle para obtener el índice de la ciudad en la lista, y use 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: uso un registro en el script, pero puedes usar dos propiedades si lo prefieres:

property cityList : {"City A", "City B", "City C", "New City"}
property coordinates : {{1, 1}, {1, 1}, {1, 1}}
    
respondido por el jackjr300 02.08.2017 - 15:31

Lea otras preguntas en las etiquetas