在这种情况下,我可以使用swift Generic吗? [英] Can I use swift Generic in this case
问题描述
我想将存储的属性添加到UIView子类,例如
UIView , UIImageView , UIPickerView 等,
我需要从subclass'es创建UIView的实例只有
子类只在Type中有所不同,所有的属性和方法都是相同的。类型的也符合一些协议。
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(识别器)
}
func panGestureHandler gestureRecognizer:UIPanGestureRecognizer)
{
}
}
类ImageView:UIImageView,UIGestureRecognizerDelegate,ProtocolDelegate2 {
var property1 = CGRectZero
var property2:Int = 0
var property3 = false
func configView(config:[String:AnyObject]){
let recognitionizer = UIPanGestureRecognizer(target:self,action :选择器(panGestureHandler: ))
recognizer.delegate = self
addGestureRecognizer(识别器)
}
func panGestureHandler(gestureRecognizer:UIPanGestureRecognizer)
{
$ b 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(识别器)
}
func panGestureHandler(gestureRecognizer:UIPanGestureRecognizer)
{
code
$ b用法:
let view = View(frame:CGRect(x:0,y:0,width:100,height:100))
让imageView = ImageVi ew(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 Generics,因为类仅在类型中有所不同。或者有更好的设计模式来更好地维护代码。
解决方案如果您的类必须是<$ c的子类,泛型不会帮助您 $ C>的UIView
class A< T:UIView> :T {//错误
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
}
}
I want to add stored properties to UIView subclass'es like UIView, UIImageView, UIPickerView etc,
I need to create UIView's Instances from the subclass'es only The subclass'es only differ in Type, all the properties and methods are same. The Type's are also conformed on a couple of protocols.
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) { } }
The Usage:
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()
Now the question, is can we use Swift Generics in this case, as the classes only differ in Types. Or is there any better design pattern for better code maintenance.
解决方案Generics won't help you if your class has to be a subclass of
UIView
. If you try to do this:class A<T: UIView> : T { // ERROR var prop: String? }
the compiler complains that
T
must be a type or protocol.You could do this:
class A<T: UIView> { var theView: T var prop: String? }
But that's not really better than simply using inheritance:
class A { var theView: UIView! var prop: String? init(view: UIView) { theView = view } }
这篇关于在这种情况下,我可以使用swift Generic吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!