Consultez le code suivant:Dans Swift 3, pourquoi la valeur de retour vide des fonctions, ->(), est-elle parfois seulement déduite, mais d'autres fois, doit être déclarée?
typealias bar =()->()
let foo:bar = { baz ->() in
print("foobar")
return()
}
let baz = foo()
print("\(baz)")
qui délivre en sortie:
foobar
()
Maintenant, si nous changeons cette ligne:
let foo:bar = { baz ->() in
à ceci:
let foo:bar = { baz in
... rien ne se passe. Par exemple, ->()
est déduit par le compilateur. (Remarque: le compilateur est heureux aussi si nous omettons return()
.)
Cependant, quant à lui, si nous changeons cette ligne:
typealias bar =()->()
à ceci:
typealias bar =()
... alors la compilateur panique et se suicide. Pourquoi?
Cela semble en conflit avec la documentation de Swift, qui définit ()
(alias Void
) comme:
Le type de retour des fonctions qui ne spécifie pas explicitement un type de retour
Selon cette déclaration, puisque typealias bar =()->()
spécifie explicitement un type de retour, donc par définition, il ne peut pas retourner ()
-et pourtant il le fait! C'est complètement illogique et contradictoire.
Est-ce que quelqu'un voudrait bien m'expliquer ce qu'il pense de cela? Quelle est la justification ici? Si ->()
est supposé être toujours inféré alors pourquoi l'avoir? Pourquoi ne pas simplement dire que ()
est toujours une fonction, telle que ()()
retourne toujours ()
?
Oui mais selon la définition de '()', '()' et '() ->()' doit avoir un sens équivalent, puisque '()' est le type retourné par les fonctions qui ne spécifient pas de type de retour. Cependant, pour déclarer une typealias pour une fonction, vous devez toujours spécifier un type de retour, d'après ce que je peux dire, alors peut-être que leur documentation est mal formulée. – CommaToast
'Cependant, pour déclarer une typealias pour une fonction, vous devez toujours spécifier un type de retour, d'après ce que je peux dire. – Alexander
'() et() ->() devraient être équivalents en ce sens qu'ils ne le sont pas. Il y a une partie clé dans cette définition que vous avez citée, que je pense que vous avez manquée: void est le type de retour *** *** qui ne spécifie pas explicitement un type de retour – Alexander