Как сделать расширение для нескольких классов Swift
у меня есть расширение:
extension UILabel {
func animateHidden(flag: Bool) {
self.hidden = flag
}
}
мне нужно сделать то же самое для UIImageView но я не хочу копировать весь код. Можно ли сделать расширение для нескольких классов?
спасибо.
2 ответов
вы можете сделать протокол и продлить его.
что-то типа:
protocol Animations {
func animateHidden(flag: Bool)
}
extension Animations {
func animateHidden(flag: Bool) {
// some code
}
}
extension UILabel: Animations {}
extension UIImageView: Animations {}
ваш метод будет доступен для расширенного класса:
let l = UILabel()
l.animateHidden(false)
let i = UIImageView()
i.animateHidden(false)
в комментарии вы спросили: "в этом случае как позвонить self на UILabel и UIImageView на
лучший способ расширить UILabel & UIImageView вместе
Swift 4.1 / Xcode 9.4
гораздо лучший способ сделать это в вашем случае было бы просто продлить UIView. Это работает, потому что оба UILabel и UIImageView оба наследуют от UIView.
расширение
extension UIView {
func animateHidden(flag: Bool) {
self.hidden = flag
}
}
использование animateHidden(flag: Bool) расширение
объявление метки и imageView:
label = UILabel()
imageView = UIImageView()
фактическое использование расширения
label.animateHidden(flag: true)
imageView.animateHidden(flag: false)
бонус-другие классы, которые многие компоненты пользовательского интерфейса соответствуют
если вы хотите, чтобы ваше расширение могло соответствовать многим различным типам компонентов пользовательского интерфейса, существует 4 типа, которым соответствует очень большое количество компонентов пользовательского интерфейса кому:
CVarArgEquatableHashableNSCoding
некоторые из многих компонентов пользовательского интерфейса включают в себя:
UILabel:
CVarArg,Equatable,Hashable,NSCodingUITextField:
CVarArg,Equatable,Hashable,NSCodingUITableViewCell:
CVarArg,Equatable,Hashable,NSCodingUITextView:
CVarArg,Equatable,Hashable,NSCodingUITableView:
CVarArg,Equatable,Hashable,NSCodingобъектами UIImage:
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:
CVarArgUIResponder:
CVarArgUIWindow:
CVarArg,Equatable,Hashable,NSCodingUIRegion:
CVarArg,Equatable,Hashable,NSCodingэлементов графического интерфейса:
CVarArg,Equatable,Hashable,NSCodingUIBezierPath:
CVarArg,Equatable,Hashable,NSCodingUIVisualEffect:
CVarArg,Equatable,Hashable,NSCodingUISearchBar:
CVarArg,Equatable,Hashable,NSCodingUIMenuItem:
CVarArgUIMenuController:
CVarArgUIStoryboard:
CVarArgи многое другое...
это означает, что путем расширения либо CVarArg, Equatable, Hashable или NSCoding, вы можете расширить большинство (если каждый не каждый) UI деталь.
Ну в любом случае, я надеюсь, все это поможет вам решить вашу проблему, и если у вас есть абсолютно любые вопросы, предложения и т. д. не стесняйтесь спрашивать!