如何为多个类Swift进行扩展

Dan*_*nny 25 ios swift swift-extensions

我有一个扩展名:

extension UILabel {
    func animateHidden(flag: Bool) {
        self.hidden = flag
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

aya*_*aio 57

您可以制定协议并对其进行扩展.

就像是:

protocol Animations {
    func animateHidden(flag: Bool)
}

extension Animations {
    func animateHidden(flag: Bool) {
        // some code
    }
}

extension UILabel: Animations {}

extension UIImageView: Animations {}
Run Code Online (Sandbox Code Playgroud)

您的方法可用于扩展类:

let l = UILabel()
l.animateHidden(false)

let i = UIImageView()
i.animateHidden(false)
Run Code Online (Sandbox Code Playgroud)

在一个评论,你问:"在这种情况下,如何调用selfUILabelUIImageViewanimateHidden功能?".您可以通过约束扩展来实现.

where子句的示例:

extension Animations where Self: UIView {
    func animateHidden(flag: Bool) {
        self.hidden = flag
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢@ Knight0fDragon对该where条款的出色评论.

  • @Danny,添加一个where子句.`扩展动画,其中Self:UIView` (3认同)

Noa*_*der 8

最好的方式去扩大UILabelUIImageView一起

斯威夫特 4.1 / Xcode 9.4

在您的情况下执行此操作的更好方法是扩展UIView. 这工作,因为这两个UILabelUIImageView两个继承UIView


延期

extension UIView {
    func animateHidden(flag: Bool) {
        self.hidden = flag
    }
}
Run Code Online (Sandbox Code Playgroud)

用法animateHidden(flag: Bool)扩展

label 和 imageView 的声明

label = UILabel()
imageView = UIImageView()
Run Code Online (Sandbox Code Playgroud)

扩展的实际使用

label.animateHidden(flag: true)
imageView.animateHidden(flag: false)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 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

  • 用户界面: 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

  • 接口: CVarArg

  • 用户界面响应者: 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

  • 界面菜单项: CVarArg

  • UIMenuController: CVarArg

  • UI故事板: CVarArg

  • 还有很多...


这意味着,无论是扩展CVarArgEquatableHashable,或者NSCoding,你可以扩展大多数(如果每不是每个)UI组件。



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