在这种情况下,我可以使用swift Generic吗? [英] Can I use swift Generic in this case

查看:91
本文介绍了在这种情况下,我可以使用swift Generic吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将存储的属性添加到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆