2015-02-05 7 views
5

Ich versuche, einen Verweis auf eine Funktion zu erhalten, wie so:Swift - Verweis auf eine Funktion mit dem gleichen Namen erhalten, aber verschiedenen Parametern

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

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

ich folgende Fehlermeldung habe: Ambiguous use of toto

Wie Ich bekomme Funktion mit bestimmten Parametern?

+0

Beachten Sie, dass 'aToto.dynamicType.toto' eine curried Funktion gibt eine Instanz der Klasse als ersten Parameter zu nehmen, weil Sie es über seinen Typ referenzieren (' aToto .dynamischerTyp'). Das Äquivalent für "aToto.toto" ist "Toto.toto (aToto)" oder "aToto.dynamicType.toto (aToto)" – Antonio

Antwort

9

Da Toto hat zwei Methoden mit dem gleichen Namen, aber unterschiedlichen Signaturen, Sie angeben müssen, welche Sie wollen:

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

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

Alternativ (wie @Antonio korrekt angegeben):

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

Wenn Sie die curried Funktionen benötigen, die eine Instanz der Klasse als das erste Argument nehmen, dann können Sie auf die gleiche Weise verfahren, nur die Signatur ist anders (@Antonios Kommentar zu Ihrer Frage vergleichen):

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

Das ist äquivalent zu 'let f1: Void -> Void = aToto.toto' und' let f2 : String -> Void = aToto.toto' – Antonio

+0

@Antonio: Du hast Recht, danke. (Eigentlich habe ich das zuerst ausprobiert, muss aber einen Fehler gemacht haben, weil er anfangs nicht kompiliert wurde.) –

+0

Gibt es keinen Unterschied zwischen 'aToto.toto' und' aToto.dynamicType.toto'? Die erste gibt ein '() -> Void 'zurück, während die zweite' Toto ->() -> Void 'zurückgibt. Ich habe eine Lib, die den zweiten Typ als Parameter verwendet, also dachte ich, ich müsste meine Funktion mit 'dynamicType'-Sachen erledigen. Aber 'aToto.dynamicType.toto as (String) -> Void' gibt den folgenden Fehler zurück:' String ist kein Subtyp von Toto' – Yaman

Verwandte Themen