Swift 具有协议问题的通用 UIView 子类
Swift Generic UIView subclass with protocol issue
我扩展了 UIView 以符合 UIGestureRecognizerDelegate 协议
下面的代码可以编译
let label = UILabel()
let recognizer = UITapGestureRecognizer(target: label.self, action: Selector("tapGestureHandler:"))
recognizer.delegate = label.self
label.addGestureRecognizer(recognizer)
现在我正在尝试创建一个通用子类来创建不同的 UIView 子类
class MyView<T:UIView> {
init() {
(T.self as T.Type).init(frame: CGRectZero)
}
func addGestureToView() {
let recognizer = UITapGestureRecognizer(target: T.self, action: Selector("tapGestureHandler:"))
// The below two lines produces syntax error
recognizer.delegate = T.self // does not conform to protocol 'UIGestureRecognizerDelegate'
T.addGestureRecognizer(recognizer) // UITapGestureRecognizer cannot convertible to UIView
}
}
对我来说奇怪的是,T.addGestureRecognizer 期望 UIView 而不是 UIGestureRecognizer
更新:
我希望 return 类型的 MyView 成为 UIView 的子类,
let view = MyView<UIView>()
//我想这样用
view.tintColor = UIColor.redColor() // I can't
// 但是,我不得不这样使用
view.subview.tintColor = UIColor.redColor()
T
是你的子视图的类型。您必须创建它的一个实例来调用 addGestureRecognizer
并将其设置为手势识别器的委托。
class MyView<T:UIView where T: UIGestureRecognizerDelegate> {
var subview: T
init() {
subview = T(frame: CGRectZero)
}
func addGestureToView() {
let recognizer = UITapGestureRecognizer(target: subview, action: Selector("tapGestureHandler:"))
recognizer.delegate = subview
subview.addGestureRecognizer(recognizer)
}
}
请注意,您假设传递给创建 MyView 实例的 class 有一个名为 tapGestureHandler:
的方法。您可能应该将此方法添加到协议中并使 T
也符合它。
我扩展了 UIView 以符合 UIGestureRecognizerDelegate 协议
下面的代码可以编译
let label = UILabel()
let recognizer = UITapGestureRecognizer(target: label.self, action: Selector("tapGestureHandler:"))
recognizer.delegate = label.self
label.addGestureRecognizer(recognizer)
现在我正在尝试创建一个通用子类来创建不同的 UIView 子类
class MyView<T:UIView> {
init() {
(T.self as T.Type).init(frame: CGRectZero)
}
func addGestureToView() {
let recognizer = UITapGestureRecognizer(target: T.self, action: Selector("tapGestureHandler:"))
// The below two lines produces syntax error
recognizer.delegate = T.self // does not conform to protocol 'UIGestureRecognizerDelegate'
T.addGestureRecognizer(recognizer) // UITapGestureRecognizer cannot convertible to UIView
}
}
对我来说奇怪的是,T.addGestureRecognizer 期望 UIView 而不是 UIGestureRecognizer
更新:
我希望 return 类型的 MyView 成为 UIView 的子类,
let view = MyView<UIView>()
//我想这样用
view.tintColor = UIColor.redColor() // I can't
// 但是,我不得不这样使用
view.subview.tintColor = UIColor.redColor()
T
是你的子视图的类型。您必须创建它的一个实例来调用 addGestureRecognizer
并将其设置为手势识别器的委托。
class MyView<T:UIView where T: UIGestureRecognizerDelegate> {
var subview: T
init() {
subview = T(frame: CGRectZero)
}
func addGestureToView() {
let recognizer = UITapGestureRecognizer(target: subview, action: Selector("tapGestureHandler:"))
recognizer.delegate = subview
subview.addGestureRecognizer(recognizer)
}
}
请注意,您假设传递给创建 MyView 实例的 class 有一个名为 tapGestureHandler:
的方法。您可能应该将此方法添加到协议中并使 T
也符合它。