在这种情况下我可以使用 swift Generic

Can I use swift Generic in this case

我想将存储的属性添加到 UIView 子类中,例如 UIViewUIImageViewUIPickerView 等,

我只需要从子类创建 UIView 的实例 子类仅类型不同,所有属性和方法都相同。类型也符合几个协议。

class View: UIView, UIGestureRecognizerDelegate, ProtocolDelegate2 {
    var property1 = CGRectZero
    var property2:Int = 0
    var property3 = false

    func configView(config: [String:AnyObject]) {
        let recognizer = UIPanGestureRecognizer(target: self , action: Selector("panGestureHandler:"))

            recognizer.delegate = self
            addGestureRecognizer(recognizer)
    }

    func panGestureHandler(gestureRecognizer:UIPanGestureRecognizer)
    {

    }
}

class ImageView: UIImageView, UIGestureRecognizerDelegate, ProtocolDelegate2 {
    var property1 = CGRectZero
    var property2:Int = 0
    var property3 = false

    func configView(config: [String:AnyObject]) {
        let recognizer = UIPanGestureRecognizer(target: self , action: Selector("panGestureHandler:"))

            recognizer.delegate = self
            addGestureRecognizer(recognizer)
    }

    func panGestureHandler(gestureRecognizer:UIPanGestureRecognizer)
    {

    }
}

class PickerView: UIPickerView, UIGestureRecognizerDelegate, ProtocolDelegate2 {
    var property1 = CGRectZero
    var property2:Int = 0
    var property3 = false

    func configView(config: [String:AnyObject]) {
        let recognizer = UIPanGestureRecognizer(target: self , action: Selector("panGestureHandler:"))

            recognizer.delegate = self
            addGestureRecognizer(recognizer)
    }

    func panGestureHandler(gestureRecognizer:UIPanGestureRecognizer)
    {

    }
}

用法:

let view = View(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
let imageView = ImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
let pickerView = PickerView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

view.configView(config: JsonData)
view.alpha = 0.5

imageView.configView(config: JsonData)
imageView.alpha = 0.2

pickerView.configView(config: JsonData)
pickerView.backgroundColor = UIColor.orangeColor()

现在的问题是,我们可以在这种情况下使用 Swift 泛型,因为 类 仅在类型上有所不同。或者有没有更好的设计模式来更好地维护代码。

如果您的class 必须是UIView 的子class,则泛型不会帮助您。如果您尝试这样做:

class A<T: UIView> : T {  // ERROR
    var prop: String?
}

编译器抱怨 T 必须是类型或协议。

你可以这样做:

class A<T: UIView> {
    var theView: T
    var prop: String?
}

但这并不比简单地使用继承更好:

class A {
    var theView: UIView!
    var prop: String?

    init(view: UIView) {
        theView = view
    }
}