Come posso aggiungere una città alla mia lista e creare una stringa if-then corrispondente?

1

Il mio codice attuale:

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

dove customLat() è una subroutine che richiede all'utente una latitudine, prova a costringerlo a un numero e genera un errore se non può, e genera un altro errore se detto numero non è compreso tra -90 e 90, e customLon() è simile, ma invece verifica tra -180 e 180. In entrambi i casi, se viene restituito un errore, richiede ancora una volta all'utente il numero corrispondente. customCity() richiede semplicemente all'utente il nome della città.

Il mio problema è cosa digitare dopo la riga copy city . C'è un modo per aggiungere un blocco if nel mio codice - cioè, avere il codice scritto su se stesso - basato sul risultato del blocco if "Nuova città"? Cioè, una volta che il codice ha stabilito le variabili city , lat e lon , verrà inserito prima che la riga end if un blocco simile alle città precedenti:

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

Sto cercando un modo in cui l'utente può inserire una città e le coordinate personalizzate, e il codice sovrascrive se stesso per consentire che sia un'opzione valida, in modo che la prossima volta che lo script venga eseguito la città personalizzata sarà disponibile come opzione e la sua selezione imposterà automaticamente lat e lon , proprio come le altre città.

    
posta DonielF 31.07.2017 - 20:13
fonte

2 risposte

1

Il tuo codice non ha bisogno di riscrivere se stesso. else si occupa già di tutti i casi non rilevati per:

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
    
risposta data 31.07.2017 - 23:34
fonte
1

L'aggiunta di linee a uno script è possibile, ma è molto complicata e non necessaria.

Hai solo bisogno di due elenchi, città e coordinate .

Utilizza semplicemente un ciclo per ottenere l'indice della città nell'elenco e usa quell'indice per ottenere le coordinate nell'altro elenco.

Ecco lo 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: utilizzo uno record nello script, ma puoi usare due proprietà se preferisci:

property cityList : {"City A", "City B", "City C", "New City"}
property coordinates : {{1, 1}, {1, 1}, {1, 1}}
    
risposta data 02.08.2017 - 15:31
fonte

Leggi altre domande sui tag