2015-02-05 10 views
5

Sto cercando di ottenere un riferimento a una funzione in questo modo:Swift - ottengo riferimento a una funzione con lo stesso nome ma diversi parametri

class Toto { 
    func toto() { println("f1") } 
    func toto(aString: String) { println("f2") } 
} 

var aToto: Toto = Toto() 
var f1 = aToto.dynamicType.toto 

ho il seguente errore: Ambiguous use of toto

Come fare Ottengo la funzione con i parametri specificati?

+0

Si noti che 'aToto.dynamicType.toto' restituisce una funzione curry prendere un'istanza di classe come primo parametro, in quanto si fa riferimento tramite il suo tipo (' aToto .dynamicType'). L'equivalente di 'aToto.toto' è' Toto.toto (aToto) 'o' aToto.dynamicType.toto (aToto) ' – Antonio

risposta

9

Dal Toto ha due metodi con lo stesso nome, ma firme diverse, è necessario specificare che quello che si desidera:

let f1 = aToto.toto as() -> Void 
let f2 = aToto.toto as (String) -> Void 

f1()   // Output: f1 
f2("foo") // Output: f2 

alternativa (come ha osservato giustamente @Antonio):

let f1:() -> Void  = aToto.toto 
let f2: String -> Void = aToto.toto 

Se hai bisogno che le funzioni curry prendano un'istanza della classe come il primo argomento allora puoi procedere allo stesso modo, solo la firma è diversa (confrontare @Antonios commento alla tua domanda):

let cf1: Toto ->() -> Void  = aToto.dynamicType.toto 
let cf2: Toto -> (String) -> Void = aToto.dynamicType.toto 

cf1(aToto)()   // Output: f1 
cf2(aToto)("bar") // Output: f2 
+0

Che è equivalente a' let f1: Void -> Void = aToto.toto' e 'let f2 : String -> Void = aToto.toto' – Antonio

+0

@Antonio: hai ragione, grazie. (In realtà l'ho provato prima, ma devo fare qualche errore, perché inizialmente non è stato compilato.) –

+0

Non c'è differenza tra 'aToto.toto' e' aToto.dynamicType.toto'? Il primo restituisce un '() -> Void' mentre il secondo restituisce' Toto ->() -> Void'. Ho una lib che prende il secondo tipo come parametro, quindi ho pensato di aver bisogno di usare la funzione 'dynamicType'. Ma 'aToto.dynamicType.toto as (String) -> Void' restituisce il seguente errore:' String non è un sottotipo di Toto' – Yaman

Problemi correlati