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.
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
.
UILabel
& UIImageView
ensembleUne 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 UIView {
func animateHidden(flag: Bool) {
self.hidden = flag
}
}
animateHidden(flag: Bool)
ExtensionDéclaration d'étiquette et imageView:
label = UILabel()
imageView = UIImageView()
tilisation réelle de l'extension
label.animateHidden(flag: true)
imageView.animateHidden(flag: false)
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:
CVarArg
Equatable
Hashable
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 ...
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!