如何为多个 类 Swift 进行扩展

How to make extension for multiple classes Swift

我有一个分机:

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

我需要为 UIImageView 制作相同的代码,但我不想复制整个代码。是否可以为多个 类 进行扩展?

谢谢。

你可以制定一个协议并扩展它。

类似于:

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)

在评论中,您提出了以下问题:"in this case how to call self for UILabel and UIImageView in animateHidden function?"。您可以通过限制扩展来做到这一点。

带有 where 子句的示例:

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

感谢@Knight0fDragon 对 where 条款的精彩评论。

一起扩展 UILabelUIImageView 的最佳方法

Swift 4.1 / Xcode 9.4

在您的情况下,更好的方法是扩展 UIView。这是可行的,因为 UILabelUIImageView 都继承自 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)

奖金 - 其他 类 许多 UI 组件符合

如果您希望您的扩展能够符合许多不同类型的 UI 组件,有 4 种类型是大量 UI 组件符合的:

  1. CVarArg
  2. Equatable
  3. Hashable
  4. NSCoding

许多 UI 组件中的一些组件包括:

  • UI标签: CVarArg, Equatable, Hashable, NSCoding

  • UITextField: CVarArg, Equatable, Hashable, NSCoding

  • UITableViewCell: CVarArg, Equatable, Hashable, NSCoding

  • UITextView: CVarArg, Equatable, Hashable, NSCoding

  • UITableView: CVarArg, Equatable, Hashable, NSCoding

  • UI图片: CVarArg, Equatable, Hashable, NSCoding

  • UIPickerView: CVarArg, Equatable, Hashable, NSCoding

  • UI视图: CVarArg, Equatable, Hashable, NSCoding

  • UIImageView: CVarArg, Equatable, Hashable, NSCoding

  • UI导航栏: CVarArg, Equatable, Hashable, NSCoding

  • UI按钮: CVarArg, Equatable, Hashable, NSCoding

  • UIBarButtonItem: CVarArg, Equatable, Hashable, NSCoding

  • UIStackView: CVarArg, Equatable, Hashable, NSCoding

  • UI工具栏: CVarArg, Equatable, Hashable, NSCoding

  • UITabBar: CVarArg, Equatable, Hashable, NSCoding

  • UITabBarItem: CVarArg, Equatable, Hashable, NSCoding

  • UIScrollView: CVarArg, Equatable, Hashable, NSCoding

  • UI拆分ViewController: CVarArg, Equatable, Hashable, NSCoding

  • UIViewController: CVarArg, Equatable, Hashable, NSCoding

  • UI屏幕: CVarArg

  • UI开关: CVarArg, Equatable, Hashable, NSCoding

  • UI滑块: CVarArgEquatableHashableNSCoding

  • UIAlertAction: CVarArg

  • UIAlertController: CVarArg, Equatable, Hashable, NSCoding

  • UIImageAsset: CVarArg, Equatable, Hashable, NSCoding

  • UIDatePicker: CVarArg, Equatable, Hashable, NSCoding

  • UI笔尖: CVarArg

  • UI回复者: CVarArg

  • UIWindow: CVarArg, Equatable, Hashable, NSCoding

  • UI地区: CVarArg, Equatable, Hashable, NSCoding

  • UI控制: CVarArg, Equatable, Hashable, NSCoding

  • UIBezierPath: CVarArg, Equatable, Hashable, NSCoding

  • UIVisualEffect: CVarArg, Equatable, Hashable, NSCoding

  • UI搜索栏: CVarArg, Equatable, Hashable, NSCoding

  • UI菜单项: CVarArg

  • UI菜单控制器: CVarArg

  • UI故事板: CVarArg

  • 还有很多...


这意味着通过扩展 CVarArgEquatableHashableNSCoding,您可以扩展大部分(如果不是每个)UI 组件。



无论如何,我希望这一切能帮助您解决问题,如果您有任何问题、建议等,请随时提出!