2015-06-16 12 views
42

Che cosa significa il carattere di sottolineatura solitario nelle definizioni di funzione?Cos'è _: in Swift mi sta dicendo?

ad es. map(_:)

Capisco che quando si definiscono le funzioni che posso fare:

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

dovrei aver quindi fare riferimento a quella come myFunc(_:) invece di myFunc(_string:), cioè volutamente nascondere il nome del parametro?

+1

la pena di leggere: Swift 3 ha apportato alcune modifiche alle modalità di utilizzo delle funzioni/i nomi dei parametri di metodo e le etichette di argomento e di nome. Ecco _underscores in funzioni con molta chiarezza: http://stackoverflow.com/questions/24437388/whats-the-underscore-representative-of-in-swift-references – Niraj

risposta

27

Swift ha bisogno di una convenzione per dire quello che il nome di una funzione è, tra cui 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) {} 

E qui è il nome di quella funzione:

myFunc(param1:param2:param3:) 

Nella vita reale, però, è possibile (anzi probabile) che uno o più parametri non esternalizzerà 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 altro dichiarazione di funzione (in Swift 2.0):

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

E qui è il nome di quella funzione:

myFunc2(_:_:_:) 

[Le specifiche Swift 2.0 è importante qui. In Swift 2.0, il primo nome param è sempre non esternalizzato per impostazione predefinita e gli altri nomi di parametro 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.]

+0

Nella prima dichiarazione, non hai dato nomi esterni per il secondo e il terzo parametro, né hai usato #. Quindi dovrebbe davvero riferirsi come hai, o è corretto perché è esternalizzato di default? - se sì, il # non è più necessario? – Alex

+1

@Alex Hai letto la nota in fondo alla mia risposta? Sto descrivendo la situazione di Swift 2.0. E '#' non c'è più in Swift 2.0. – matt

+0

L'ho letto, ma mi confondevo nel tentativo di correlare 2.0 con 1.2, quando non dovevo esserlo. Quello che hai detto ha senso, dovrò rileggere la guida con 2.0 questa volta. @matt – Alex

61

Il _ viene utilizzato per definire che il parametro non è nominato

Se si dispone di più _ si afferma che non è necessario per nominare i parametri della tua chiamata di funzione

func myFunc(name:String, _ age:String){ 
} 

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

Se lo fai non usare la sottolineatura che si usa

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

il _ non è necessaria in chiamate di funzione. È solo usato per indicare che qualcosa non ha un nome.

Riguardo al modo in cui si farebbe riferimento alla funzione, non è necessario passare alcun nome per la chiamata di funzione.
Ma dal momento che anche voi non definisce un tipo di parametro questo mi sembra come un esempio valido (almeno non funziona in Xcode 7 con rapida 2.0)

Edit:
Dal SWIFT 3.0

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

Dovrebbe essere utilizzato

+0

Sono nuovo di swift 2.0. Vedo che non hai usato il carattere di sottolineatura per il primo parametro in entrambi i casi. Quindi dovresti anche dichiarare il nome nella chiamata alla funzione in questo modo: myFunc (nome: "Milo", età: "Sono davvero un vecchio mago")? – user234159

10

Quando si fa riferimento a una funzione, per disambiguare è necessario fornire il nome della funzione insieme ai nomi esterni di qualsiasi parametro previsto.

Ad esempio,

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

e

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

rappresentano due funzioni diverse, una dove un'etichetta esterna è prevista per il primo parametro stringa quando viene chiamata la funzione e la altro in cui non viene utilizzata alcuna etichetta, come in:

myFunc(myString: "hi")

e

myFunc("hi")

Quindi, al fine di identificare una funzione includiamo l'etichetta esterno per ciascun parametro dove ':' indica che un parametro deve essere fornita - esempio yourFunc(arg1:arg2:) prenderà 2 argomenti.

Se non si utilizza un'etichetta esterna, inseriamo un carattere di sottolineatura ('_').

Per le 2 funzioni di cui sopra, vorremmo identificare in modo univoco utilizzando:

myFunc(myString:) e myFunc(_:)

Problemi correlati