在这种情况下我可以使用 swift Generic
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 泛型,因为 类 仅在类型上有所不同。或者有没有更好的设计模式来更好地维护代码。
如果您的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
}
}
我想将存储的属性添加到 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 泛型,因为 类 仅在类型上有所不同。或者有没有更好的设计模式来更好地维护代码。
如果您的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
}
}