web-dev-qa-db-ja.com

複数のクラスを拡張する方法Swift

私には拡張子があります:

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

UIImageViewにも同じものを作成する必要がありますが、そのコード全体をコピーしたくありません。複数のクラスの拡張を作成することはできますか?

ありがとう。

24
Danny

プロトコルを作成して拡張できます。

何かのようなもの:

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)

コメントで、「この場合、selfUILabelおよびUIImageView関数のanimateHiddenを呼び出す方法を尋ねました」。それを行うには、拡張機能を制限します。

where句を使用した例:

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

where句に関する優れたコメントをしてくれた@ Knight0fDragonに感謝します。

56
ayaio

UILabelUIImageViewを一緒に拡張する最適な方法

Swift 4.1/Xcode 9.4

あなたのケースでこれを行うはるかに良い方法は、単にUIViewを拡張することです。これは、UILabelUIImageViewの両方がUIViewから継承するため機能します。


拡張

_extension UIView {
    func animateHidden(flag: Bool) {
        self.hidden = flag
    }
}
_

animateHidden(flag: Bool) Extensionの使用

ラベルとimageViewの宣言

_label = UILabel()
imageView = UIImageView()
_

拡張機能の実際の使用法

_label.animateHidden(flag: true)
imageView.animateHidden(flag: false)
_

ボーナス-多くのUIコンポーネントが適合する他のクラス

拡張機能を多くの異なる種類のUIコンポーネントに適合させたい場合、非常に多くのUIコンポーネントが適合する4つのタイプがあります。

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

多くのUIコンポーネントの一部は次のとおりです。

  • ILabel:CVarArgEquatableHashableNSCoding

  • ITextField:CVarArgEquatableHashableNSCoding

  • ITableViewCell:CVarArgEquatableHashableNSCoding

  • ITextView:CVarArgEquatableHashableNSCoding

  • ITableView:CVarArgEquatableHashableNSCoding

  • IImage:CVarArgEquatableHashableNSCoding

  • IPickerView:CVarArgEquatableHashableNSCoding

  • IView:CVarArgEquatableHashableNSCoding

  • IImageView:CVarArgEquatableHashableNSCoding

  • INavigationBar:CVarArgEquatableHashableNSCoding

  • IButton:CVarArgEquatableHashableNSCoding

  • IBarButtonItem:CVarArgEquatableHashableNSCoding

  • IStackView:CVarArgEquatableHashableNSCoding

  • IToolbar:CVarArgEquatableHashableNSCoding

  • ITabBar:CVarArgEquatableHashableNSCoding

  • ITabBarItem:CVarArgEquatableHashableNSCoding

  • IScrollView:CVarArgEquatableHashableNSCoding

  • ISplitViewController:CVarArgEquatableHashableNSCoding

  • IViewController:CVarArgEquatableHashableNSCoding

  • IScreen:CVarArg

  • ISwitch:CVarArgEquatableHashableNSCoding

  • ISlider:CVarArgEquatableHashableNSCoding

  • IAlertAction:CVarArg

  • IAlertController:CVarArgEquatableHashableNSCoding

  • IImageAsset:CVarArgEquatableHashableNSCoding

  • IDatePicker:CVarArgEquatableHashableNSCoding

  • INib:CVarArg

  • IResponder:CVarArg

  • IWindow:CVarArgEquatableHashableNSCoding

  • IRegion:CVarArgEquatableHashableNSCoding

  • IControl:CVarArgEquatableHashableNSCoding

  • IBezierPath:CVarArgEquatableHashableNSCoding

  • IVisualEffect:CVarArgEquatableHashableNSCoding

  • ISearchBar:CVarArgEquatableHashableNSCoding

  • IMenuItem:CVarArg

  • IMenuController:CVarArg

  • IStoryboard:CVarArg

  • その他多数...


つまり、CVarArgEquatableHashable、またはNSCodingのいずれかを拡張することで、ほとんど(すべてではない場合)UIコンポーネントを拡張できます。



とにかく、これがすべて問題の解決に役立つことを願っています。質問や提案などがあれば、お気軽にお問い合わせください。



3
Noah Wilder