Как сделать расширение для нескольких классов 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 деталь.
Ну в любом случае, я надеюсь, все это поможет вам решить вашу проблему, и если у вас есть абсолютно любые вопросы, предложения и т. д. не стесняйтесь спрашивать!
