2015-02-05 10 views
5

Próbuję dostać referencję do funkcji tak:Swift - dostać referencję do funkcji o tej samej nazwie, ale o różnych parametrach

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

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

Mam następujący błąd: Ambiguous use of toto

Jak zrobić Otrzymuję funkcję o określonych parametrach?

+0

Zauważ, że 'aToto.dynamicType.toto' zwraca nassza funkcję robienia instancji klasy jako pierwszy parametr, ponieważ jesteś przedstawieniu go poprzez jego typu (' aToto .dynamicType'). Odpowiednikiem 'aToto.toto' jest' Toto.toto (aToto) 'lub' aToto.dynamicType.toto (aToto) ' – Antonio

Odpowiedz

9

Od Toto ma dwie metody o tej samej nazwie, ale różnych podpisów, trzeba określić, który z nich chcesz:

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

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

Alternatywnie (jak słusznie zauważył @Antonio):

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

Jeśli potrzebujesz funkcji curried, biorąc instancję klasy jako pierwszy argument następnie możesz postępować w ten sam sposób, tylko podpis jest inny (porównaj @Antonios komentarz do Twojego pytania):

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

Który jest równoważny' let f1: Void -> Void = aToto.toto' i 'let f2 : String -> Void = aToto.toto' – Antonio

+0

@Antonio: Masz rację, dziękuję. (Właściwie to próbowałem to najpierw, ale musiałem popełnić błąd, ponieważ początkowo nie kompilował.) –

+0

Czy nie ma różnicy między 'aToto.toto' i' aToto.dynamicType.toto'? Pierwszy zwraca '() -> Void', podczas gdy drugi zwraca' Toto ->() -> Void'. Mam lib, który przyjmuje drugi typ jako parametr, więc myślałem, że muszę uzyskać mój func z rzeczami 'dynamicType'. Ale 'aToto.dynamicType.toto as (String) -> Void' zwraca następujący błąd:' String nie jest podtypem Toto'a – Yaman

Powiązane problemy