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
,NSCoding
UITextField:
CVarArg
,Equatable
,Hashable
,NSCoding
UITableViewCell:
CVarArg
,Equatable
,Hashable
,NSCoding
UITextView:
CVarArg
,Equatable
,Hashable
,NSCoding
UITableView:
CVarArg
,Equatable
,Hashable
,NSCoding
UIImage:
CVarArg
,Equatable
,Hashable
,NSCoding
UIPickerView:
CVarArg
,Equatable
,Hashable
,NSCoding
UIView:
CVarArg
,Equatable
,Hashable
,NSCoding
UIImageView:
CVarArg
,Equatable
,Hashable
,NSCoding
UINavigationBar:
CVarArg
,Equatable
,Hashable
,NSCoding
UIButton:
CVarArg
,Equatable
,Hashable
,NSCoding
UIBarButtonItem:
CVarArg
,Equatable
,Hashable
,NSCoding
UIStackView:
CVarArg
,Equatable
,Hashable
,NSCoding
UIToolbar:
CVarArg
,Equatable
,Hashable
,NSCoding
UITabBar:
CVarArg
,Equatable
,Hashable
,NSCoding
UITabBarItem:
CVarArg
,Equatable
,Hashable
,NSCoding
UIScrollView:
CVarArg
,Equatable
,Hashable
,NSCoding
UISplitViewController:
CVarArg
,Equatable
,Hashable
,NSCoding
UIViewController:
CVarArg
,Equatable
,Hashable
,NSCoding
UIScreen:
CVarArg
UISwitch:
CVarArg
,Equatable
,Hashable
,NSCoding
UISlider:
CVarArg
,Equatable
,Hashable
,NSCoding
UIAlertAction:
CVarArg
UIAlertController:
CVarArg
,Equatable
,Hashable
,NSCoding
UIImageAsset:
CVarArg
,Equatable
,Hashable
,NSCoding
UIDatePicker:
CVarArg
,Equatable
,Hashable
,NSCoding
UINib:
CVarArg
Contestador de UIR:
CVarArg
UIWindow:
CVarArg
,Equatable
,Hashable
,NSCoding
UIRegion:
CVarArg
,Equatable
,Hashable
,NSCoding
UIControl:
CVarArg
,Equatable
,Hashable
,NSCoding
UIBezierPath:
CVarArg
,Equatable
,Hashable
,NSCoding
UIVisualEffect:
CVarArg
,Equatable
,Hashable
,NSCoding
UISearchBar:
CVarArg
,Equatable
,Hashable
,NSCoding
UIMenuItem:
CVarArg
UIMenuController:
CVarArg
UIStoryboard:
CVarArg
Y 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
.