Как сделать расширение для нескольких классов 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 типа, которым соответствует очень большое количество компонентов пользовательского интерфейса кому:
CVarArg
Equatable
Hashable
NSCoding
некоторые из многих компонентов пользовательского интерфейса включают в себя:
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
UIResponder:
CVarArg
UIWindow:
CVarArg
,Equatable
,Hashable
,NSCoding
UIRegion:
CVarArg
,Equatable
,Hashable
,NSCoding
элементов графического интерфейса:
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
и многое другое...
это означает, что путем расширения либо CVarArg
, Equatable
, Hashable
или NSCoding
, вы можете расширить большинство (если каждый не каждый) UI деталь.
Ну в любом случае, я надеюсь, все это поможет вам решить вашу проблему, и если у вас есть абсолютно любые вопросы, предложения и т. д. не стесняйтесь спрашивать!