Swift 3需要更多信息来推断参数? [英] Swift 3 needs more info, to infer a parameter?

查看:77
本文介绍了Swift 3需要更多信息来推断参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

但在Swift 3中,


通用参数'T'无法推断



 公共扩展UIResponder 
{
public func next< T>() - > T'
{
guard let responder = self.next
else {return nil}
return(responder as?T)?? responder.next()
}
}

//注意 - 对这个优秀帖子的赞誉:
// https://blog.veloxdb.com/2016 / 05/12 / bubbling-events-using-uiresponder-in-swift /

在Swift中<3 ,你可以像这样使用它:

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

恐怕不仅(a)我不明白为什么它不会在Swift 3中被推断,但是(b)无休止地尝试随机变化,我无法让它在Swift 3中工作:O


解决方案

现有下一步 UIResponder 的方法以及您的扩展方法。 self.next 在$ b $内部,您的方法引用(generic)方法本身。



重命名扩展名使它编译:

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

即使你没有' t请求它,这是一个迭代,而不是
递归版本:)

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


I have an extension which bubbles upwards,

but in Swift 3,

Generic parameter 'T' could not be inferred

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/

in Swift<3, you could use that like this:

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

I'm afraid that not only (a) I can't see why it wouldn't be inferred in Swift 3, but (b) even by endlessly trying random variations, I can't get it to work in Swift 3 :O

解决方案

That is a name collision between the existing next method of UIResponder, and your extension method. self.next inside your method refers to the (generic) method itself.

Renaming the extension makes it compile:

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

And even if you didn't ask for it, here is an iterative instead of recursive version :)

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
    }
}

这篇关于Swift 3需要更多信息来推断参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆