Как сделать расширение для нескольких классов 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 типа, которым соответствует очень большое количество компонентов пользовательского интерфейса кому:

  1. CVarArg
  2. Equatable
  3. Hashable
  4. 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 деталь.



Ну в любом случае, я надеюсь, все это поможет вам решить вашу проблему, и если у вас есть абсолютно любые вопросы, предложения и т. д. не стесняйтесь спрашивать!