1

Tenir compte de la signature de la méthode suivante:Pourquoi l'inférence de type ne vient-elle pas à la rescousse dans le cas d'une fonction rapide avec plusieurs paramètres par défaut uniquement typés?

func doSomething(_ boolToConsider: Bool = false, _ stringToConsider: String? = nil) 

appel à cette méthode dans les résultats de manière suivante une erreur:

doSomething("foo") 

error message

Pourquoi ne Swift reconnais que je compte à utiliser la valeur par défaut boolToConsider et le stringToConsider fourni?

+1

Avez-vous essayé d'utiliser un nom externe des paramètres de la fonction? Vous pouvez également utiliser deux fonctions, l'une recevra Boolean, la seconde String et ensuite la troisième fonction pour faire des choses communes pour les deux – Woof

Répondre

1

Je ne sais pas pourquoi les auteurs de Swift ne le supportent pas ou s'ils envisagent de le supporter. Je peux spéculer que cela conduit à un code assez confus pour avoir une inférence basée sur le type de quelles parties d'une liste d'arguments ont été passées.

Vous pouvez simplement surcharger votre fonction.

func doSomething(_ stringToConsider: String) { 
    doSomething(false, stringToConsider) 
} 
0

L'inférence de type ne fonctionne pas dans votre exemple car toutes les étiquettes de vos paramètres externes sont anonymes (_). Donner doSomething au moins une étiquette de paramètre va corriger cela. enter image description here

2

Comme déjà mentionné par @Woof vous pouvez accomplir ce que vous voulez fournir 3 différentes signatures de méthode et que l'un d'eux, peuvent avoir tous les paramètres avec les valeurs par défaut sinon il se plaindra sur l'utilisation ambiguë de votre méthode:

func doSomething(_ bool: Bool) { 
    print("bool:", bool) 
} 
func doSomething(_ string: String) { 
    print("string:", string) 
} 
func doSomething(_ bool: Bool = false, _ string: String = "") { 
    print("bool:", bool) 
    print("string:", string) 
} 

doSomething(true) 
doSomething("foo") 
doSomething() 
doSomething(true, "foo") 

Ce imprimera

doSomething with bool value only

bool: true

doSomething with string value only

string: foo

doSomething with default values

bool: false

string: default

doSomething with default values

bool: true

string: foo