Come altri hanno già detto, è una questione di stile di origine con Objective-C.
Per capire perché qualcuno vorrebbe questo stile, prendere in considerazione una modifica del vostro esempio:
func say(greeting: String) {
print("\(greeting)")
}
che si potrebbe chiamare in questo modo:
say("Hello!")
Quando si guarda i nomi che si stiamo usando, c'è probabilmente qualche informazione mancante. Con una funzione chiamata say()
, potresti ragionevolmente pensare che questa sia una funzione che ti consente di dire qualcosa. Ma quando si guarda il nome del parametro, è abbastanza chiaro che questa è una funzione per dire un saluto, non per dire nulla.
Così Objective-C preferirebbe di scrivere in questo modo:
func sayGreeting(greeting: String) {
print("\(greeting)")
}
che si potrebbe chiamare in questo modo:
sayGreeting("Hello!")
ed è ormai chiaro che lei sta dicendo un saluto. In altre parole, il nome della funzione stessa descrive più chiaramente cosa stai facendo. Per questo motivo, lo sayGreeting("Hello!")
è preferibile a say(greeting: "Hello!")
perché la chiave che una funzione deve essere descritta con il suo nome, non relegata a un nome di parametro e data importanza secondaria.
Ma questo ragionamento funziona solo per il primo argomento. Supponiamo di voler aggiungere un nome, come hai fatto tu. In un linguaggio come C, dove ci sono i nomi dei parametri esterni a tutti, si potrebbe scrivere:
void sayGreetingToName(char * greeting, char * person) { ...
e chiamarlo come:
sayGreetingToName("Hello", "Dave");
che è OK, ma inizia a dissolversi rapidamente quando si è sovraccaricato funzioni o valori di default, nessuno dei quali si hanno in C. Se si voleva scrivere:
func sayGreetingToName(greeting: String, name: String? = nil) {
if let name = name {
print("\(greeting), \(name)!")
}
else {
print("\(greeting)!")
}
}
poi definendolo come:
sayGreetingToName("Hello", "Dave")
apparirebbe sostanzialmente OK, ma:
sayGreetingToName("Hello")
sembra ridicolo, perché il nome della funzione dice che si sta fornendo un nome, ma non lo sei.
Così, invece, se si scrive:
func sayGreeting(greeting: String, toName: String? = nil) {
if let name = toName {
print("\(greeting), \(name)!")
}
else {
print("\(greeting)!")
}
}
si può chiamare in due modi:
sayGreeting("Hello")
sayGreeting("Hello", toName: "Dave")
e tutto sembra perfettamente chiaro.
Quindi, per riassumere, l'idea alla base di questo stile di scrittura è che il nome della funzione stesso dovrebbe contenere qualsiasi informazione contenuta nel nome del primo parametro, ma che non ha senso estenderlo ai parametri successivi. Quindi, per impostazione predefinita, il primo non ha un nome esterno, ma il resto lo fa. La funzione consiste nel dire sempre un saluto, in modo che sia inerente al nome della funzione (e quindi non duplicata insistendo sul nome esterno del primo parametro) ma può o non può riguardare il dirlo a un nome particolare, in modo che le informazioni dovrebbero non essere nel nome della funzione.
consente anche di leggere essenzialmente una chiamata di funzione come se fosse inglese, perché i nomi ed i parametri sono ora circa nel giusto ordine per voi a fare quanto segue:
sayGreeting("Hello", toName: "Dave")
Say (il) saluto, "Ciao", a (la persona con) nome "Dave"
È uno stile piuttosto bello, una volta che ci si abitua.
quindi stai chiedendo perché i creatori della lingua hanno deciso di andare * così * in questo modo? – luk2302
Penso che non sia coerente avere il primo parametro senza nome esterno e il resto dei parametri hanno nomi esterni, penso che dovrebbero essere meglio che tutti i parametri utilizzino nomi esterni per una migliore leggibilità. Penso che cambino meglio il design e abbiano tutti i parametri con nomi esterni. –