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

Generics Swift 3需要更多信息来推断参数?,generics,swift3,Generics,Swift3,我有一个向上冒泡的分机 但在Swift 3中 无法推断泛型参数“T” 我担心不仅(a)我不明白为什么不能在Swift 3中推断出它,而且(b)即使无休止地尝试随机变量,我也无法在Swift 3中使用它:O这是UIResponder的现有next方法和您的扩展方法之间的名称冲突自我。下一步内部 您的方法引用(泛型)方法本身 重命名扩展名使其可编译: public extension UIResponder { public func nextOfType<T>() ->

我有一个向上冒泡的分机

但在Swift 3中

无法推断泛型参数“T”


我担心不仅(a)我不明白为什么不能在Swift 3中推断出它,而且(b)即使无休止地尝试随机变量,我也无法在Swift 3中使用它:O

这是
UIResponder
的现有
next
方法和您的扩展方法之间的名称冲突<代码>自我。下一步内部 您的方法引用(泛型)方法本身

重命名扩展名使其可编译:

public extension UIResponder {
    public func nextOfType<T>() -> T? {
        guard let responder = self.next
            else { return nil }
        return (responder as? T) ?? responder.nextOfType()
    }
}
公共扩展UIResponder{
公共函数nextOfType()->T{
guard let responder=self.next
else{return nil}
返回(应答器为?T)??应答器.nextOfType()
}
}
即使你没有要求,这里是一个迭代而不是 递归版本:)

公共扩展UIResponder{
公共函数nextOfType()->T{
无功电流=自
而let responder=current.next{
如果让匹配=响应者为?T{
复赛
}
当前=响应者
}
归零
}
}

真正奇怪的是,在函数中添加一个未命名的参数是有效的,例如
public func next(uquo:Void=())->T?
。编译器似乎无法在具有相同名称的属性和无参数方法之间消除歧义(我不明白为什么在这种情况下不能通过强制转换或类型推断消除歧义)@Hamish:你是对的,声明了计算属性
var foo
和方法
func foo()->Int
在Swift 2和Swift 3中的“无效重新声明”失败。我必须承认,关于我的另一个棘手的扩展,你们必须修复。。。我不明白为什么我不需要在这里使用元类型。(或者这确实可以使用元类型方法编写吗?与让?
if相反)@JoeBlow:您可以将(元)类型作为参数传递(如您的另一个问题中所述),或者让它从上下文推断(如本问题中所述)。我不认为一种方法比另一种好,做你最了解的事情。
class SnapDot:UIView 
    {
    .....
    func handleTap(g:UITapGestureRecognizer)
        {
        (next() as Snap?)?.oneDotWasClicked(self)
        }
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
    }
}