Hai il permesso di definire due funzioni con lo stesso nome se hanno tipi differenti, o se essi si distingue per il loro parametro esterno etichette di argomento. Il tipo di una funzione è composto dal parametro Types tra parentesi, seguito da ->
, seguito dal tipo restituito. Si noti che le etichette degli argomenti NON fanno parte del Tipo della funzione. (ma vedi AGGIORNAMENTO di seguito.)
Ad esempio, le seguenti funzioni entrambi hanno lo stesso nome e sono di tipo (Int, Int) -> Int
:
// This:
func add(a: Int, b: Int) -> Int {
return a + b
}
// Is the same Type as this:
func add(x: Int, y: Int) -> Int {
return x + y
}
Questo produrrà un errore di compilazione - la modifica delle etichette a:b:
-x:y:
non distingue il due funzioni. (Ma vedere Update sotto.)
Utilizzando le funzioni del signor Web come esempi:
// Function A: This function has the Type (UITableView, Int) -> Int
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }
// Function B: This function has the Type (UITableView, NSIndexPath) -> UITableViewCell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { ... }
// Function C: This made up function will produce a compile-time error because
// it has the same name and Type as Function A, (UITableView, Int) -> Int:
func tableView(arg1: UITableView, arg2: Int) -> Int { ... }
Funzione A e la funzione B di cui sopra non sono in conflitto, perché sono di diversi tipi. Funzione A e Funzione C sopra do conflitto perché hanno lo stesso Tipo. La modifica delle etichette dei parametri non risolve il conflitto se i tipi rimangono gli stessi.(vedere Update di seguito.)
override
è un concetto del tutto diverso, e credo che alcune delle altre risposte coprire, quindi salterò esso.
AGGIORNAMENTO: parte di ciò che ho scritto sopra non è corretto. È vero che le etichette dei parametri di una funzione non fanno parte della definizione di Tipo, ma possono essere usate per distinguere due funzioni che hanno lo stesso Tipo, purché la funzione abbia etichette esterne diverse in modo che il compilatore possa dire quale funzione che stai cercando di chiamare quando la invochi. Esempio:
func add(a: Int, to b: Int) -> Int { // called with add(1, to: 3)
println("This is in the first function defintion.")
return a + b
}
func add(a: Int, and b: Int) -> Int { // called with add(1, and: 3)
println("This is in the second function definition")
return a + b
}
let answer1 = add(1, to: 3) // prints "This is in the first function definition"
let answer2 = add(1, and: 3) // prints "This is in the second function definition"
Quindi, l'uso di etichette esterni in una definizione di funzione consente funzioni con lo stesso nome e dello stesso tipo per compilare. Pertanto, sembra che sia possibile scrivere più funzioni con lo stesso nome, purché il compilatore possa distinguerle in base al loro tipo o alle loro etichette di firma esterna. Non penso che le etichette interne siano importanti. (Ma spero che qualcuno mi corregga se sbaglio.)
+1 per includere la spiegazione dell'etichetta esterna. L'ho trovato nella libreria di simd e, anche se fico, sono rimasto sorpreso che fosse permesso così è andato a cercare e ho trovato la tua risposta. 'public init (_ columns: [double3])' e 'public init (rows: [double3])' sono entrambi inizializzatori validi per 'double3x3' ed entrambi hanno lo stesso tipo di firma. – Omegaman
Più precisamente: si desidera utilizzare i nomi dei parametri (per la definizione interna) e le etichette degli argomenti (per le chiamate esterne). Non le etichette dei parametri. (Si prega di correggermi se ho torto o non è così preciso penso di essere) – SLN
Sembra che ci siano più avvertimenti a questo. Vale a dire, se una classe rapida estende una classe Obj-C, o se avete annotato entrambe le funzioni con @objc, non sarete in grado di sovraccaricare in base al tipo, poiché i selettori sono gli stessi. Correlato, è possibile escludere un metodo dall'essere un selettore objc quando si estende una classe objc, cioè l'annotazione opposta a @objc? –