2016-07-19 247 views
12

Ho un interno:Come rendere estensione per più classi Swift

extension UILabel { 
    func animateHidden(flag: Bool) { 
     self.hidden = flag 
    } 
} 

ho bisogno di fare lo stesso per UIImageView ma non voglio copiare tutto quel codice. È possibile creare un'estensione per più classi?

Grazie.

+2

Si può semplicemente usare 'estensione UIView'? Dipenderà dall'implementazione di 'animateHidden' – Kevin

+0

@Kevin tutto il codice di' animateHidden' sarà utile per entrambe le classi 'UILabel',' UIImageView' – Danny

risposta

30

È possibile creare un protocollo ed estenderlo.

Qualcosa di simile:

protocol Animations { 
    func animateHidden(flag: Bool) 
} 

extension Animations { 
    func animateHidden(flag: Bool) { 
     // some code 
    } 
} 

extension UILabel: Animations {} 

extension UIImageView: Animations {} 

vostro metodo sarà disponibile per le classi estesi:

let l = UILabel() 
l.animateHidden(false) 

let i = UIImageView() 
i.animateHidden(false) 

in un commento, hai chiesto: "in questo caso come chiamare self per UILabel e UIImageView nella funzione animateHidden? ". Lo fai vincolando l'estensione.

Esempio con una clausola where:

extension Animations where Self: UIView { 
    func animateHidden(flag: Bool) { 
     self.hidden = flag 
    } 
} 

Grazie a @ Knight0fDragon per il suo ottimo commento sulla clausola di where.

+0

In questo caso come chiamare 'self' per' UILabel' e 'UIImageView' nella funzione 'animateHidden'? – Danny

+3

@Danny, aggiungi una clausola where. 'estensioni Animazioni dove Self: UIView' – Knight0fDragon

+0

Ma allora non dovrai fare' estensioni Animazioni dove Self: UIImageView' e riprodurre la stessa implementazione per 'animateHidden (flag:)'? Questo tipo di distrugge lo scopo di riutilizzare il codice di implementazione. – HuaTham