Fonctions multiples avec le même nom

Je suis nouveau chez Swift et je suis passé par quelques tutoriels et beaucoup d'entre eux définissent une fonction plus d'une fois avec le même nom.

je suis habitué à d'autres langages de programmation où cela ne peut pas être fait autrement il y a une erreur.

par conséquent j'ai vérifié l'officiel Manuel Swift et a aussi coché le remplacer mot-clé pour voir ce que je pourrais en tirer, mais je ne peux toujours pas comprendre ce qui suit code:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")

    cell.textLabel?.text = "Row #(indexPath.row)"
    cell.detailTextLabel?.text = "Subtitle #(indexPath.row)"

    return cell
}

D'après ce que je vois, la fonction tableView est définie dans la ligne 1 comme dans la ligne 5, la seule différence que j'ai remarqué est que la première fonction tableView renvoie un Int et le second renvoie un Object(utile Viewcell).

dans ce cas, je vois d'après le résultat que la seconde fonction ne supplante pas la première.

Qu'est-ce que cela signifie et pourquoi est-il possible de définir une fonction plus d'une fois avec le même nom sans remplaçant?

18
demandé sur Mr.Web 2014-12-29 16:44:38

4 réponses

vous êtes autorisé à définir deux fonctions avec le même nom si elles ont des Types différents, ou si elles peuvent être distinguées par leurs étiquettes d'arguments externes. Le Type d'une fonction est composé des types de paramètres entre parenthèses, suivi de ->, suivi du Type de retour. Notez que les étiquettes d'argument ne font pas partie du Type de la fonction. (mais voir Mise à jour ci-dessous.)

par exemple, les fonctions suivantes ont le même nom et sont de Type (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
}

cela produira une erreur de compilation-changer les étiquettes de a:b:x:y: ne distingue pas les deux fonctions. (mais voir Mise à jour ci-dessous.)

à l'Aide de M. Web de fonctions à titre d'exemple:

// 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 { ... }

les fonctions A et B ci-dessus ne sont pas en conflit parce qu'elles sont de Types différents. la Fonction et de la Fonction C au-dessus de conflit parce qu'ils ont le même Type. Changer les étiquettes de paramètre ne résolvent pas le conflit si les Types restent les mêmes. (voir la mise à jour ci-dessous.)

override est un concept tout à fait différent, et je pense que certaines des autres réponses le couvrent, donc je vais sauter.

mise à jour: une partie de ce que j'ai écrit ci-dessus est incorrecte. Il est vrai que les étiquettes de paramètres d'une fonction ne font pas partie de sa définition de Type, mais elles peuvent être utilisées pour distinguer deux fonctions qui ont le même Type, à condition que la la fonction a des étiquettes externes qui sont différentes de sorte que le compilateur peut dire quelle fonction vous essayez d'appeler quand vous l'invoquez. Exemple:

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"

ainsi, l'utilisation d'étiquettes externes dans une définition de fonction permettra de compiler des fonctions avec le même nom et du même type. Donc, il semble que vous pouvez écrire plusieurs fonctions avec le même nom aussi long que le compilateur peut les distinguer par leurs types ou externe étiquettes de signature. Je ne pense pas qu'interne les étiquettes de la matière. (Mais j'espère que quelqu'un me corrigera si je me trompe.)

23
répondu Aaron Rasmussen 2014-12-29 19:58:23

Vous envisagez de surcharge de la fonction.

un extrait de la documentation D'Apple ici:

Vous pouvez surcharger une fonction générique ou d'initialiseur en fournissant différentes contraintes, exigences, ou les deux, sur les paramètres de type la clause des paramètres génériques. Lorsque vous appelez un générique surchargé fonction ou initialiseur, le compilateur utilise ces contraintes pour résoudre quelle fonction surchargée ou initialiseur à invoquer.

Par exemple:

protocol A { }
protocol B { }

class A1: A { }
class A2: A { }

class B1: B { }
class B2: B { }

func process<T: A>(value: T)
{
    // process values conforming to protocol A
}

func process<T: B>(value: T)
{
    // process values conforming to protocol B
}

ou:

func process(value: Int)
{
    // process integer value
}

func process(value: Float)
{
    // process float value
}

il s'agit simplement d'une confusion typique qui pourrait survenir au cours d'une transition de L'Objectif-C à la rapidité. Vous devriez lire au sujet des noms de paramètre ici.

6
répondu Vatsal Manot 2016-11-16 09:51:28

dans Swift, comme dans L'Objectif-C, les paramètres d'une fonction font partie de la définition. Il n'y a pas deux fonctions appelées tableView, il y a une fonction appelée tableView(tableView:, numberOfRowsInSection:) et un tableView(tableView:, cellForRowAtIndexPath:)

4
répondu jrturton 2014-12-29 14:06:44

Les fonctions ne sont pas les mêmes, ils sont différents . Parce qu'ils ne prennent pas les mêmes arguments et retour des choses différentes . C'est l'explication simple si vous ne comprenez pas les génériques.

0
répondu Name 2014-12-29 13:49:00