dlradiobutton ios swift swift-extensions

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:

  1. CVarArg
  2. Equatable
  3. Hashable
  4. 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 .