gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:29:38 24 4
gpt4 key购买 nike

我有三个 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)。我想成为 DRY(不要重复自己)并从某处继承此类重复的计算属性或方法。有办法吗?

我知道有一种方法可以通过协议(protocol)扩展和协议(protocol)方法的默认实现来做到这一点——但它看起来不太干净:

Calling protocol default implementation from regular method

最佳答案

我猜这可行,尽管 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),而不能在其他类中遵循此协议(protocol)。

或者,您可以这样做:

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
}
}

你看,这将创建一个重复代码。没有你问题中的那么多,但它仍然是重复代码。明智地选择你想要的。

关于Swift:在不相互继承的类之间共享方法和计算属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39093073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com