子类/扩展的UIView,因此所有其他视图(的UIImageView,...的UITextField)继承在创建

问题描述:

是什么时,我要添加到UIView的一个功能建议的方法,使我的应用程序中的所有观点得到那些?事实上,我需要添加一些存储的属性,所以扩展是不可能的。因为我需要处理的文本框,ImageViews,视图(谁知道还有什么会来)我不想继承每隔各的过添加的功能,因此我们的目标是使的UIView的子类,我的所有控件(如果可能的话)开箱即可获得该功能。子类/扩展的UIView,因此所有其他视图(的UIImageView,...的UITextField)继承在创建

的扩展名这将是容易的,但正如我所说,我需要存储一些东西太多,所以这一目标的子类实现的?还是什么话是正确的做法(也许还有第三个选项)

感谢

+0

嘿,那里,我在2-3年前看到了类似的问题,它被回答 - >请看看更好..我认为关键是使用这个https://developer.apple.com/documentation/objectivec/1441536-class_setsuperclass方法... 但是,你应该小心,因为例如'UITextField'超级'UIControl' - 也似乎被贬损 – ColdSteel

+0

是的,这样的smt会是完美的,但很明显,这个选项。我将搜索是否存在与swift类似的smtp – rimes

+0

在运行时有一个很糟糕的方式,在objective-c中有关联的属性,但是yuck。最好谈谈为什么你认为你需要为这些观点添加属性并考虑一些替代方案。作为总体原则,大量观点用于展示和编辑模型,并且通常是我们试图用属性丰富的模型。 – danh

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

您不能这样做(无需访问源代码),因为您将通过在UIView及其子类之间注入自己的类来有效更改类继承树。

考虑的影响,如果语言允许这样的:

  • Class A定义的属性,a
  • Class B继承Class A并定义属性b,因为Class A没有这个属性,它是罚款。从Class B
  • Class C继承和既有ab性能。

现在,如果您可以'0123'以下注册Class A1'Class A

  • Class A1可以定义一个属性,b,这是很好的,因为Class A没有这个属性
  • Class B现在有一个问题,但因为b冲突与超b
  • Class C有多继承钻石问题属性b

当然,你只打算添加不冲突的属性(虽然你不知道这是因为你不知道所有可能的子类实现),并且不需要子类来访问你的属性,所以多个继承 不是问题,但如果这样的功能是用语言编写的,那么这些潜在的问题就需要解决,因为你不能依靠每个人都有同样的意图。

+0

我其实想写更深一些,也写了一些东西,但既然不可能,我决定把它删掉,讨论它会浪费时间:)谢谢你的回答和澄清 – rimes

你为什么不定义一个协议,并在协议扩展提供了默认的实现,然后让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() 
     } 
    } 
} 
+0

Bcz这部分是无效的内部扩展名“var someVar:Bool” – rimes

+0

它是如何无效? –

+0

但我仍然需要在“someVar”中存储一些值。我也需要一个setter,然后你得到错误 – rimes