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:有一种方法可以让仅某些子类有权访问超类的扩展的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 必须被子类覆盖的类方法

swift 学习- 14 -- 继承

学习Swift -- 继承

Swift - 在超类的覆盖函数中返回子类类型

Swift 错误 - 方法不覆盖其超类中的任何方法

Swift 继承