Swift 3需要更多信息来推断参数?

时间:2016-10-03 16:11:22

标签: generics swift3

我有一个向上冒泡的扩展,

但在Swift 3中,

  

通用参数' T'无法推断

public extension UIResponder
    {
    public func next<T>() -> T?
        {
        guard let responder = self.next
            else { return nil }
        return (responder as? T) ?? responder.next()
        }
    }

 // note - kudos to this excellent post:
 // https://blog.veloxdb.com/2016/05/12/bubbling-events-using-uiresponder-in-swift/

在Swift&lt; 3中,您可以像这样使用它:

class SnapDot:UIView 
    {
    .....
    func handleTap(g:UITapGestureRecognizer)
        {
        (next() as Snap?)?.oneDotWasClicked(self)
        }

我担心不仅(a)我无法理解为什么它不能在Swift 3中被推断,而且(b)即使通过无休止地尝试随机变化,我也可以&#39 ;让它在Swift 3:O

中运行

1 个答案:

答案 0 :(得分:3)

这是next现有UIResponder方法与您的扩展方法之间的名称冲突。 self.next里面 你的方法指的是(泛型)方法本身。

重命名扩展名使其编译:

public extension UIResponder {
    public func nextOfType<T>() -> T? {
        guard let responder = self.next
            else { return nil }
        return (responder as? T) ?? responder.nextOfType()
    }
}

即使你没有要求它,这里是迭代而不是 递归版:)

public extension UIResponder {
    public func nextOfType<T>() -> T? {
        var current = self
        while let responder = current.next {
            if let match = responder as? T {
                return match
            }
            current = responder
        }
        return nil
    }
}