web-dev-qa-db-fra.com

Comment faire une extension pour plusieurs classes Swift

J'ai une extension:

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

Je dois faire le même pour UIImageView mais je ne veux pas copier tout ce code. Est-il possible de faire une extension pour plusieurs classes?

Merci.

24
Danny

Vous pouvez créer un protocole et l'étendre.

Quelque chose comme:

protocol Animations {
    func animateHidden(flag: Bool)
}

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

extension UILabel: Animations {}

extension UIImageView: Animations {}

Votre méthode sera disponible pour les classes étendues:

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

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

Dans un commentaire, vous avez demandé: "dans ce cas, comment appeler self pour UILabel et UIImageView dans animateHidden fonction?". Pour ce faire, vous limitez l'extension.

Exemple avec une clause where:

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

Merci à @ Knight0fDragon pour son excellent commentaire sur la clause where.

56
ayaio

Meilleure méthode pour étendre UILabel & UIImageView ensemble

Swift 4.1/Xcode 9.4

Une bien meilleure façon de procéder dans votre cas serait de simplement étendre UIView. Cela fonctionne car UILabel et UIImageView héritent tous les deux de UIView.


Extension

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

Utilisation de animateHidden(flag: Bool) Extension

Déclaration d'étiquette et imageView:

label = UILabel()
imageView = UIImageView()

tilisation réelle de l'extension

label.animateHidden(flag: true)
imageView.animateHidden(flag: false)

Bonus - Autres classes auxquelles de nombreux composants d'interface utilisateur sont conformes

Si vous souhaitez que votre extension soit compatible avec de nombreux types de composants d'interface utilisateur, il existe 4 types auxquels une très grande quantité de composants d'interface utilisateur sont conformes:

  1. CVarArg
  2. Equatable
  3. Hashable
  4. NSCoding

Certains des nombreux composants de l'interface utilisateur incluent:

  • ILabel:CVarArg, Equatable, Hashable, NSCoding

  • ITextField:CVarArg, Equatable, Hashable, NSCoding

  • ITableViewCell:CVarArg, Equatable, Hashable, NSCoding

  • ITextView:CVarArg, Equatable, Hashable, NSCoding

  • ITableView:CVarArg, Equatable, Hashable, NSCoding

  • IImage:CVarArg, Equatable, Hashable, NSCoding

  • IPickerView:CVarArg, Equatable, Hashable, NSCoding

  • IView:CVarArg, Equatable, Hashable, NSCoding

  • IImageView:CVarArg, Equatable, Hashable, NSCoding

  • INavigationBar:CVarArg, Equatable, Hashable, NSCoding

  • IButton:CVarArg, Equatable, Hashable, NSCoding

  • IBarButtonItem:CVarArg, Equatable, Hashable, NSCoding

  • IStackView:CVarArg, Equatable, Hashable, NSCoding

  • IToolbar:CVarArg, Equatable, Hashable, NSCoding

  • ITabBar:CVarArg, Equatable, Hashable, NSCoding

  • ITabBarItem:CVarArg, Equatable, Hashable, NSCoding

  • IScrollView:CVarArg, Equatable, Hashable, NSCoding

  • ISplitViewController:CVarArg, Equatable, Hashable, NSCoding

  • IViewController:CVarArg, Equatable, Hashable, NSCoding

  • IScreen:CVarArg

  • ISwitch:CVarArg, Equatable, Hashable, NSCoding

  • ISlider:CVarArg, Equatable, Hashable, NSCoding

  • IAlertAction:CVarArg

  • IAlertController:CVarArg, Equatable, Hashable, NSCoding

  • IImageAsset:CVarArg, Equatable, Hashable, NSCoding

  • IDatePicker:CVarArg, Equatable, Hashable, NSCoding

  • INib:CVarArg

  • Répondeur UIR:CVarArg

  • IWindow:CVarArg, Equatable, Hashable, NSCoding

  • IRegion:CVarArg, Equatable, Hashable, NSCoding

  • IControl:CVarArg, Equatable, Hashable, NSCoding

  • IBezierPath:CVarArg, Equatable, Hashable, NSCoding

  • IVisualEffect:CVarArg, Equatable, Hashable, NSCoding

  • ISearchBar:CVarArg, Equatable, Hashable, NSCoding

  • IMenuItem:CVarArg

  • IMenuController:CVarArg

  • IStoryboard:CVarArg

  • Et bien d'autres ...


Cela signifie qu'en étendant CVarArg, Equatable, Hashable ou NSCoding, vous pouvez étendre la plupart (sinon tous les) composants d'interface utilisateur.



De toute façon, j'espère que tout cela vous aidera à résoudre votre problème et si vous avez absolument des questions, des suggestions, etc., n'hésitez pas à demander!



3
Noah Wilder