Jouer avec l'exemple de code de Swift Language Guide: Extensions J'ai extedned Double struct comme cecoulée de type Implicite dans Swift
extension Double {
func someFunc() {
print("someFunc")
}
}
J'ai été surpris que cette déclaration
2.someFunc()
n'a pas généré erreur de compilation de temps comme : La valeur du type 'Int' n'a aucun membre 'someFunc'. Je m'attendais à ce que la valeur de 2 soit implicitement castée à Int, mais Swift la jeta à Double. Pourquoi donc ? Comment Swift détermine-t-il que la valeur de 2 dans ce cas est de type Double?
J'ai essayé d'appeler someFunc() comme
let x = 2
x.someFunc()
Ici j'obtiens l'erreur de compilation attendue
Does'n cette déclaration en contradiction avec Swift Programming Language 3.0.1 : Language guide : The basics : Type Safety and Type Inference?
inférence de type permet un compilateur de déduire le type d'une expression particulière automatiquement lorsqu'il compile votre code, simplement en examinant les valeurs que vous fournissez.
EDIT
D'après les réponses que j'ai appris que cela arrive parce que Double est conforme au protocole ExpressibleByIntegerLiteral. Cependant Float struct s'y conforme aussi et d'autres types aussi. Ci-dessous j'ai créé ma structure qui est également conforme à ce protocole. À la fin, cependant, Double est choisi au moment de la compilation. Pourquoi? Comment la préséance de la méthode d'une extension est-elle déterminée par rapport à la méthode d'une autre extension?
struct someStruct: ExpressibleByIntegerLiteral{
var i:Int = 0
init(integerLiteral value: Int64){
i = Int(value)
}
}
extension someStruct {
func someFunc() {print("Somestruct someFunc") }
}
extension Double {
func someFunc() { print("Double someFunc") }
}
4.someFunc()
//prints: Double someFunc
C'est une bonne question dans le montage. – Alexander