具有协议问题的Swift Generic UIView子类

RK1*_*979 5 generics uiview uigesturerecognizer ios swift

我扩展了UIView以符合UIGestureRecognizerDelegate协议

下面的代码编译

let label = UILabel()
let recognizer = UITapGestureRecognizer(target: label.self, action: Selector("tapGestureHandler:"))
recognizer.delegate = label.self
label.addGestureRecognizer(recognizer)
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试创建一个Generic Subclass来创建不同的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
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说奇怪的是,T.addGestureRecognizer期望UIView而不是UIGestureRecognizer

更新:

我希望MyView的返回类型是UIView的子类,

let view = MyView<UIView>()
Run Code Online (Sandbox Code Playgroud)

//我想用这种方式使用它

view.tintColor = UIColor.redColor() // I can't
Run Code Online (Sandbox Code Playgroud)

//但是,我必须这样使用

view.subview.tintColor = UIColor.redColor()
Run Code Online (Sandbox Code Playgroud)

Mar*_*bri 3

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您假设用于创建 MyView 实例的类具有名为 的方法tapGestureHandler:。您可能应该将此方法添加到协议中并使其T也符合它。