Swift:有一种方法可以让仅某些子类有权访问超类的扩展
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift:有一种方法可以让仅某些子类有权访问超类的扩展相关的知识,希望对你有一定的参考价值。
我目前正处于一个项目的开始,试图为UIViews,UIButtons和UIImageViews创建一些通用的可检查/可设计的变量,以使InterfaceBuilder中的设计更加容易。例如:
@IBInspectable
var cornerRadius: CGFloat
get
return layer.cornerRadius
set
layer.cornerRadius = newValue
我看到要实现这一目标的一个建议是:
extension UIView
@IBInspectable
var cornerRadius: CGFloat
get
return layer.cornerRadius
set
layer.cornerRadius = newValue
但是,问题在于,现在UIView的all子类显示了可检查的属性,当我可能仅在三个类上使用这些属性时,这是有问题的,并且我添加了诸如边框宽度/颜色,阴影半径,不透明度,偏移量和颜色,它们占据了IB中许多检查器窗格。
我想要这样的东西:
@IBDesignable class MyView: UIView, MyDesignable
@IBDesignable class MyButton: UIButton, MyDesignable
@IBDesignable class MyImageView: UIImageView, MyDesignable
protocol MyDesignable
extension MyDesignable where Self: UIView
@IBInspectable
var cornerRadius: CGFloat
get
return layer.cornerRadius
set
layer.cornerRadius = newValue
...
不幸的是,@IBInspectable
弹出错误Only instance properties can be declared @IBInspectable
。
我也尝试过:
@IBDesignable class MyView: UIView
@IBDesignable class MyButton: UIButton
@IBDesignable class MyImageView: UIImageView
private extension UIView
@IBInspectable
var cornerRadius: CGFloat
get
return layer.cornerRadius
set
layer.cornerRadius = newValue
...
但是,其他UIView子类仍显示可检查的属性。
希望问题背后的意图是有意义的。如果您有任何建议,请告诉我。谢谢!
答案
扩展名会更改基类定义。如果有某种子类有选择地从超类继承的方式,例如忽略扩展名,则会破坏Liskov Substitution Principle。 如果只有三个需要这些属性的对象,则分别对每个子类进行子类化可能是一个更好的选择。
以上是关于Swift:有一种方法可以让仅某些子类有权访问超类的扩展的主要内容,如果未能解决你的问题,请参考以下文章