Как сделать расширение для нескольких классов Swift

У меня есть расширение:

extension UILabel {
    func animateHidden(flag: Bool) {
        self.hidden = flag
    }
}

Мне нужно сделать то же самое для UIImageView но я не хочу копировать весь этот код. Можно ли сделать расширение для нескольких классов?

Благодарю.

Ответ 1

Вы можете сделать протокол и расширить его.

Что-то вроде:

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 в animateHidden function?". Вы делаете это, ограничивая расширение.

Пример с предложением where:

extension Animations where Self: UIView {
    func animateHidden(flag: Bool) {
        self.hidden = flag
    }
}

Благодаря @Knight0fDragon за его замечательный комментарий о том, where статья.

Ответ 2

Лучший способ 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

  • UIControl: 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, вы можете расширить большинство (если не каждый) компонент пользовательского интерфейса.



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