为什么我不能使用泛型参数来重载函数?

时间:2014-09-01 15:12:51

标签: generics swift overloading calayer

我有一个应该响应手势的图层。 所以我的UIView正在将所有手势转发给这个函数(在CALayer子类中)。

func handleGesture<T: UIGestureRecognizer>(gesture: T, atPosition position : CGPoint)
    {
        if let hitLayer = hitTest(position)? as? THGestureProtocol
        {
            if let tapGesture = gesture as? UITapGestureRecognizer
            {
                hitLayer.handleTapGesture(tapGesture, atPosition: position)
            }
            else
            {
                hitLayer.handleGesture(gesture, atPosition: position)
            }
        }
    }

然后,此函数会查找相应的子图层并转发手势。

@objc protocol THGestureProtocol
{
    func handleGesture(gesture: UIGestureRecognizer,    atPosition position : CGPoint)
    func handleTapGesture(gesture: UITapGestureRecognizer, atPosition position : CGPoint)
    func handleDragGesture(gesture: UIPanGestureRecognizer, atPosition position : CGPoint)
}

此代码有效但我希望像这样重载调用函数

func handleGesture<T: UIGestureRecognizer>(gesture: T, atPosition position : CGPoint)
    {
        if let hitLayer = hitTest(position)? as? THGestureProtocol
        {
            hitLayer.handleGesture(gesture, atPosition: position)
        }
    }


@objc protocol THGestureProtocol
{
    func handleGesture(gesture: UIGestureRecognizer,    atPosition position : CGPoint)
    func handleGesture(gesture: UITapGestureRecognizer, atPosition position : CGPoint)
    func handleGesture(gesture: UIPanGestureRecognizer, atPosition position : CGPoint)
}

这不起作用。只调用第一个函数。那么为什么这不起作用呢?

1 个答案:

答案 0 :(得分:0)

此处描述了此行为:https://forums.developer.apple.com/message/17580#17580

长话短说,函数体是用T的给定信息编译的,而不是T下调用函数的真实类型。这与C ++中的模板不同。

class A {}
class B: A {}
class C: A {}

func f(_: A) {
    print("A")
}

func f(_: B) {
    print("B")
}

func f(_: C) {
    print("C")
}

func ff<T: A>(a: T) {
    f(a)
}

func gg(a: A) {
    f(a)
}

在此示例中,函数 ff gg 等效。