2016-01-08 5 views
8

Supponiamo di avere diverse funzioni in overload in una classe:Utilizzando funzioni sovraccaricate come cittadini di prima classe

func appendToABC(string s: String) -> String { 
    return "ABC \(s)" 
} 

func appendToABC(duplicatedString s: String) -> String { 
    return "ABC \(s)\(s)" 
} 

e abbiamo alcune API che ottiene funzione come argomento:

func printString(function: (String) -> String) { 
    print(function("ASD")) 
} 

Come possiamo passare una delle funzioni appendToABC come argomento per una funzione printString?

Ho pensato di avvolgere la funzione con una chiusura, ma non un aspetto gradevole

printString { appendToABC(duplicatedString: $0) } 
+3

È possibile che le funzioni differiscano nei relativi argomenti o tipi di ritorno (http://stackoverflow.com/questions/33803888/specify-type-of-polymorphic-function-to-pass-it-as-argument). Ma non credo sia possibile se le funzioni differiscono * solo * nei nomi dei parametri esterni. –

risposta

5

Questa è una limitazione nota a Swift. C'è un open proposal per affrontarlo. Attualmente l'unica soluzione è una chiusura.

Si noti che questo è vero per molte cose in Swift. Inoltre, non è possibile fare riferimento alle proprietà direttamente come funzioni, anche se si comportano come funzioni. Devi usare una chiusura. E anche alcune funzioni gratuite non possono essere passate direttamente (l'esempio più comune è rappresentato da print).