[英]Can I use swift Generic in this case
我想將存儲的屬性添加到UIView子類,如UIView , UIImageView , UIPickerView等,
我只需要從子類創建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.