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

2024-04-10

我有一个向上冒泡的延伸部分,

但在 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

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

我担心不仅(a)我不明白为什么它不会在 Swift 3 中推断出来,而且(b)即使通过无休止地尝试随机变化,我也无法让它在 Swift 3 中工作:O


这是现有的名称之间的冲突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
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3 需要更多信息来推断参数? 的相关文章