首页 > 解决方案 > 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 的所有子类都显示了可检查的属性,当我只在可能三个类上使用这些属性时,这是有问题的,并且我添加了更多属性,如边框宽度/颜色、阴影半径、不透明度、偏移量和颜色,这些在 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 子类仍然显示可检查的属性。

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

标签: iosswiftuikitinterface-builderxib

解决方案


推荐阅读