dlradiobutton - radio button in ios
Cómo hacer extensión para múltiples clases de Swift (2)
Tengo una extensión:
extension UILabel {
func animateHidden(flag: Bool) {
self.hidden = flag
}
}
Necesito hacer el mismo para UIImageView pero no quiero copiar todo el código. ¿Es posible hacer una extensión para múltiples clases?
Gracias.
El mejor método para extender UILabel y UIImageView juntos
Swift 4.1 / Xcode 9.4
Una forma mucho mejor de hacer esto en su caso sería simplemente extender UIView . Esto funciona porque tanto UILabel como UIImageView heredan de UIView .
Extensión
extension UIView {
func animateHidden(flag: Bool) {
self.hidden = flag
}
}
Uso de la animateHidden(flag: Bool)
Declaración de etiqueta y imageView :
label = UILabel()
imageView = UIImageView()
Uso actual de la extensión
label.animateHidden(flag: true)
imageView.animateHidden(flag: false)
Bonificación - Otras clases que muchos componentes de la interfaz de usuario cumplen con
Si desea que su extensión sea compatible con muchos tipos diferentes de componentes de la interfaz de usuario, existen 4 tipos a los que se ajustan una gran cantidad de componentes de la interfaz de usuario:
-
CVarArg -
Equatable -
Hashable -
NSCoding
Algunos de los muchos componentes de la interfaz de usuario incluyen:
UILabel:
CVarArg,Equatable,Hashable,NSCodingUITextField:
CVarArg,Equatable,Hashable,NSCodingUITableViewCell:
CVarArg,Equatable,Hashable,NSCodingUITextView:
CVarArg,Equatable,Hashable,NSCodingUITableView:
CVarArg,Equatable,Hashable,NSCodingUIImage:
CVarArg,Equatable,Hashable,NSCodingUIPickerView:
CVarArg,Equatable,Hashable,NSCodingUIView:
CVarArg,Equatable,Hashable,NSCodingUIImageView:
CVarArg,Equatable,Hashable,NSCodingUINavigationBar:
CVarArg,Equatable,Hashable,NSCodingUIButton:
CVarArg,Equatable,Hashable,NSCodingUIBarButtonItem:
CVarArg,Equatable,Hashable,NSCodingUIStackView:
CVarArg,Equatable,Hashable,NSCodingUIToolbar:
CVarArg,Equatable,Hashable,NSCodingUITabBar:
CVarArg,Equatable,Hashable,NSCodingUITabBarItem:
CVarArg,Equatable,Hashable,NSCodingUIScrollView:
CVarArg,Equatable,Hashable,NSCodingUISplitViewController:
CVarArg,Equatable,Hashable,NSCodingUIViewController:
CVarArg,Equatable,Hashable,NSCodingUIScreen:
CVarArgUISwitch:
CVarArg,Equatable,Hashable,NSCodingUISlider:
CVarArg,Equatable,Hashable,NSCodingUIAlertAction:
CVarArgUIAlertController:
CVarArg,Equatable,Hashable,NSCodingUIImageAsset:
CVarArg,Equatable,Hashable,NSCodingUIDatePicker:
CVarArg,Equatable,Hashable,NSCodingUINib:
CVarArgContestador de UIR:
CVarArgUIWindow:
CVarArg,Equatable,Hashable,NSCodingUIRegion:
CVarArg,Equatable,Hashable,NSCodingUIControl:
CVarArg,Equatable,Hashable,NSCodingUIBezierPath:
CVarArg,Equatable,Hashable,NSCodingUIVisualEffect:
CVarArg,Equatable,Hashable,NSCodingUISearchBar:
CVarArg,Equatable,Hashable,NSCodingUIMenuItem:
CVarArgUIMenuController:
CVarArgUIStoryboard:
CVarArgY muchos más...
Esto significa que al extender CVarArg , Equatable , Hashable o NSCoding , puede extender la mayoría de los componentes de UI (si no todos).
Bueno, de todos modos, espero que todo esto le ayude a resolver su problema y si tiene alguna pregunta, sugerencia, etc., ¡no dude en preguntar!
Podrías hacer un protocolo y extenderlo.
Algo como:
protocol Animations {
func animateHidden(flag: Bool)
}
extension Animations {
func animateHidden(flag: Bool) {
// some code
}
}
extension UILabel: Animations {}
extension UIImageView: Animations {}
Su método estará disponible para las clases extendidas:
let l = UILabel()
l.animateHidden(false)
let i = UIImageView()
i.animateHidden(false)
En un comentario, has preguntado: "en este caso, ¿cómo llamarse self para UILabel y UIImageView en la función animateHidden ?". Lo haces restringiendo la extensión.
Ejemplo con una cláusula where :
extension Animations where Self: UIView {
func animateHidden(flag: Bool) {
self.hidden = flag
}
}
Gracias a @ Knight0fDragon por su excelente comentario sobre la cláusula where .