我有一个应该响应手势的图层。 所以我的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)
}
这不起作用。只调用第一个函数。那么为什么这不起作用呢?
答案 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 等效。