Subclass/Extend UIView 所以所有其他视图(UIImageView、UITextField ...)在创建时继承

Subclass/Extend UIView so all other Views (UIImageView, UITextField ...) inherit upon creation

当我想向 UIView 添加功能以便我的应用程序中的所有视图都获得这些功能时,建议的方法是什么?事实上,我也需要添加一些存储的属性,因此无法进行扩展。由于我需要处理 Textfields、ImageViews、Views(谁知道还会有什么),我不想将每一个子类化,也不想添加该功能,所以目标是创建 UIView 和我所有控件的子类(如果可能的话)开箱即用该功能。

有了扩展会很容易,但是正如我所说,我也需要存储一些东西,那么这个目标可以通过子类实现吗?或者什么是正确的方法(也许还有第三种选择)

谢谢

为什么不定义一个协议并在协议扩展中提供默认实现,然后让 UIView 符合该协议?这是一个例子:

protocol MyProto {
    var someVar: Bool { get set }
    func someFunc() -> Void
}

extension MyProto {
    var someVar: Bool {
        get {
            // provide default implementation
            return true
        }
        set {

        }
    }

    func someFunc() -> Void {
        // provide common implementation
    }
}

extension UIView: MyProto {}

您还可以使用 where 子句来限制类型的默认行为。

extension MyProto where Self: UIControl {
    var someVar: Bool {
        get {
            return isUserInteractionEnabled
        }
        set {
            isUserInteractionEnabled = newValue
        }
    }
}

extension MyProto where Self: UITextField {
    var someVar: Bool {
        get {
            return isFirstResponder
        }
        set {
            newValue ? becomeFirstResponder() : resignFirstResponder()
        }
    }
}

TLDR;你不能这样做,你将需要子class每个你想引入新属性的UI元素。

您不能这样做(无法访问源代码),因为您将通过在 UIView 和它的 class 之间注入您自己的 class 来有效地更改 class 继承树subclasses.

考虑一下如果一种语言允许这样的含义:

  • Class A定义了一个属性,a
  • Class B继承自Class A,定义了一个属性b,这很好,因为Class A没有这个属性。
  • Class C 继承自 Class B 并具有 ab 属性。

现在,如果您可以 'inject' Class A1 以某种方式 'below' Class A 会发生什么?

  • Class A1可以定义一个属性、b,这很好,因为Class A没有这个属性
  • Class B 现在有问题了,因为 its b 与 superclass b[=50 冲突=]
  • Class C 具有 属性 b
  • 的多重继承菱形问题

当然,您只打算添加不冲突的属性(尽管您不知道这一点,因为您不知道所有可能的子class实现)并且不需要subclasses 访问你的 属性,所以多重继承 这不是问题,但如果这样的功能是在一种语言中,这些潜在的问题就需要解决,因为你不能指望每个人都有与你相同的意图。