Swift:有一种方法可以让仅某些子类有权访问超类的扩展

问题描述 投票:0回答:1

我目前正处于一个项目的开始,试图为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子类仍显示可检查的属性。

希望问题背后的意图是有意义的。如果您有任何建议,请告诉我。谢谢!

ios swift uikit interface-builder xib
1个回答
0
投票
扩展名会更改基类定义。如果有某种子类有选择地从超类继承的方式,例如忽略扩展名,则会破坏Liskov Substitution Principle

如果只有三个需要这些属性的对象,则分别对每个子类进行子类化可能是一个更好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.