簡體   English   中英

我可以在這種情況下使用swift通用

[英]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泛型嗎,因為類僅在類型上有所不同。 還是有更好的設計模式來進行更好的代碼維護。

如果您的類必須是UIView的子類, 泛型將無法為您提供幫助。 如果您嘗試這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM