Il problema qui è che si sta estendendo Int
di aggiungere una variabile denominata abs
- che è anche il nome della funzione che si stanno chiamando.
Quando si tenta di chiamare la funzione abs()
sul Int
, vede la variabile abs
che è stato creato ed è confuso perché pensa che si sta tentando di restituire quella variabile e non capisce il motivo per cui si sta inviando un parametro .
Se si rinomina la variabile su absoluteValue
o altro, dovrebbe funzionare.
let value = -13
abs(value)
extension Int {
var absoluteValue:Int {
return abs(self)
}
}
value.abs
Aggiornamento: Come altri hanno detto, si può anche risolvere il disambiguazione dell'uso di abs
richiamando esplicitamente la funzione nel quadro Swift
. Questo dovrebbe funzionare altrettanto bene della soluzione di cui sopra.
let value = -13
abs(value)
extension Int {
var abs:Int {
return Swift.abs(self)
}
}
value.abs
Anche se, personalmente, vorrei ancora rinominare la mia nuova funzione per absoluteValue
come nel primo esempio, in modo che il suo chiaro che non sta chiamando il Swift.abs()
quando si utilizza la variabile abs
.
Aha! Grazie a entrambi. Lo capisco adesso. La prima persona a modificare la sua risposta per mostrare che posso impostare la funzione libera come 'Swift.abs (self)' ottiene il 'accept': D –
Inoltre, questo è il motivo per cui odio il sé implicito. –