当我想向 UIView 添加功能以便我的应用程序中的所有 View 都获得这些功能时,建议的方法是什么?事实上,我也需要添加一些存储的属性,因此无法进行扩展。由于我需要处理 Textfields、ImageViews、Views(谁知道还会有什么),我不想将每一个子类化,也不想添加该功能,所以目标是创建 UIView 和我所有控件的子类(如果可能的话)开箱即用该功能。
有了扩展会很容易,但正如我所说,我也需要存储一些东西,那么这个目标可以通过子类实现吗?或者什么是正确的方法(也许还有第三种选择)
谢谢
最佳答案
为什么不定义一个协议(protocol)并在协议(protocol)扩展中提供默认实现,然后让 UIView 符合该协议(protocol)?这是一个例子:
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()
}
}
}
关于ios - 子类化/扩展 UIView,以便所有其他 View (UIImageView、UITextField ...)在创建时继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44751659/