Swift:在不相互继承的类之间共享方法和计算属性

时间:2016-08-23 05:34:01

标签: swift

我有三个Swift类:

@IBDesignable class CustomTextField : UITextField {

  @IBInspectable var borderColor: UIColor = UIColor.clearColor() {
    didSet {
      layer.borderColor = borderColor.CGColor
    }
  }

}

@IBDesignable class CustomView : UIView {

  @IBInspectable var borderColor: UIColor = UIColor.clearColor() {
    didSet {
      layer.borderColor = borderColor.CGColor
    }
  }

}

@IBDesignable class CustomButton : UIButton {

  @IBInspectable var borderColor: UIColor = UIColor.clearColor() {
    didSet {
      layer.borderColor = borderColor.CGColor
    }
  }

}

所有三个类都具有相同的计算属性(borderColor)。 我想要干(不要重复自己)并且从某个地方继承了这样的重复计算属性或方法。有没有办法做到这一点?

我知道有一种方法可以通过协议扩展和协议方法的默认实现来实现这一点 - 但它看起来并不那么干净:

Calling protocol default implementation from regular method

2 个答案:

答案 0 :(得分:0)

我想这可行,虽然IMO并不完美:

protocol BorderColorView {
    var borderColor: UIColor! { get set }
}

extension BorderColorView {
    var borderColor: UIColor! {
        get {
            if let color = (self as? UIView)?.layer.borderColor {
                return UIColor(CGColor: color)
            }
            return nil
        }
        set {
            (self as? UIView)?.layer.borderColor = newValue.CGColor
        }
    }
}

//Example usage:

class MyView: UIView, BorderColorView { }

这样做的一个缺点是,您只能在UIView中使用此协议,而不能在其他类中使用。

或者,你可以这样做:

protocol BorderColorView {
    var view: UIView { get }
    var borderColor: UIColor! { get set }
}

extension BorderColorView {
    var borderColor: UIColor! {
        get {
            if let color = (self as? UIView)?.layer.borderColor {
                return UIColor(CGColor: color)
            }
            return nil
        }
        set {
            (self as? UIView)?.layer.borderColor = newValue.CGColor
        }
    }
}

// Example usage:

class MyView: UIView, BorderColorView {
    var view: UIView {
        return self
    }
}

您会看到,这将创建一个重复代码。不像你的问题那么多,但仍然是重复的代码。明智地选择你想要的东西。

答案 1 :(得分:0)

为什么不为UIView编写扩展程序,您可以在每个UI元素中使用它