Cos’è _: in Swift mi sta dicendo?

Cosa significa il carattere di sottolineatura solitario nelle definizioni di funzione?

es. map(_:)

Capisco che quando si definiscono le funzioni che posso fare:

 func myFunc(_ string: String) { ... } 

Vorrei quindi fare riferimento a questo come myFunc(_:) invece di myFunc(_string:) , cioè volutamente nascondendo il nome del parametro?

Swift ha bisogno di una convenzione per dire quale sia il nome di una funzione, includendo non solo il nome della funzione stessa (prima delle parentesi), ma anche i nomi esterni dei parametri. La convenzione è che i nomi sono seguiti da due punti. Quindi ecco una dichiarazione di funzione (in Swift 2.0):

 func myFunc(param1 param1:String, param2:String, param3:String) {} 

Ed ecco il nome di quella funzione:

 myFunc(param1:param2:param3:) 

Nella vita reale, tuttavia, è ansible (anzi probabile) che uno o più parametri non esternalizzino alcun nome. Quindi abbiamo bisogno di un segnaposto per quel nome. Il carattere di sottolineatura è quel segnaposto, proprio come il carattere di sottolineatura è il simbolo nella dichiarazione che sopprime l’esternalizzazione del nome. Quindi, ecco un’altra dichiarazione di funzione (in Swift 2.0):

 func myFunc2(param1:String, _ param2:String, _ param3:String) {} 

Ed ecco il nome di quella funzione:

 myFunc2(_:_:_:) 

[Le specifiche Swift 2.0 sono importanti qui. In Swift 2.0, il primo nome param non è sempre esternalizzato per impostazione predefinita e gli altri nomi param sono esternalizzati per impostazione predefinita. In Swift 1.2 e precedenti, le regole di esternalizzazione dipendevano da dove appariva la dichiarazione, che era inutilmente incoerente e confusa.]

Il _ è usato per definire che il parametro non è denominato

Se si dispone di più _ si afferma che non è necessario assegnare un nome ai parametri nella chiamata di funzione

 func myFunc(name:String, _ age:String){ } myFunc(“Milo", "I'm a really old wizard") 

Se non usi il carattere di sottolineatura che useresti

 myFunc(“Milo”, age: "I'm a really old wizard") 

_ Non è necessario nelle chiamate di funzione. È solo usato per indicare che qualcosa non ha un nome.

Per quanto riguarda il modo in cui si farebbe riferimento alla funzione, non è necessario passare alcun nome per la chiamata di funzione.
Ma dal momento che non si definisce un tipo di parametro questo mi sembra un esempio non valido (almeno non funziona in xCode 7 con swift 2.0)

Modificare:
Dal momento che swift 3.0

 myFunc(name: “Milo”, age: "I'm a really old wizard") 

Dovrebbe essere usato

Quando ci si riferisce a una funzione, per disambiguare è necessario fornire il nome della funzione insieme ai nomi esterni di qualsiasi parametro che si aspetta.

Per esempio,

func myFunc(myString string: String) { ... }

e

func myFunc(_ string: String) { ... }

rappresentano due diverse funzioni, una in cui viene fornita un’etichetta esterna per il primo parametro String quando viene chiamata la funzione e l’altra dove non viene utilizzata l’etichetta, come in:

myFunc(myString: "hi")

e

myFunc("hi")

Quindi, per identificare una funzione includiamo l’etichetta esterna per ogni parametro dove ‘:’ indica che deve essere fornito un parametro – es. yourFunc(arg1:arg2:) prenderà 2 argomenti.

Quando non viene utilizzata un’etichetta esterna, inseriamo un carattere di sottolineatura (‘_’).

Per le 2 funzioni sopra riportate, le identificheremmo in modo univoco usando:

myFunc(myString:) e myFunc(_:)