【问题标题】:Swift 3 needs more info, to infer a parameter?Swift 3 需要更多信息来推断参数?
【发布时间】:2016-10-19 04:04:57
【问题描述】:

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

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

【问题讨论】:

    标签: generics swift3


    【解决方案1】:

    这是UIResponder 的现有next 方法与您的扩展方法之间的名称冲突。 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
        }
    }
    

    【讨论】:

    • 真正奇怪的是向函数添加一个未命名的参数是可行的,例如public func next&lt;T&gt;(_: Void = ()) -&gt; T?。似乎编译器无法消除具有相同名称的属性和无参数方法之间的歧义(我不明白为什么在这种情况下您不应该通过强制转换或类型推断来消除歧义)
    • @Hamish:你是对的,在 Swift 2 和 3 中同时声明计算属性 var foo 和方法 func foo() -&gt; Int 均失败,并出现“无效重新声明”。
    • 我必须承认,我的另一个棘手的扩展,你们必须修复...stackoverflow.com/questions/39835397 ...我很困惑为什么我不需要在这里使用元类型。 (或者确实可以使用元类型方法编写?而不是if let?)
    • @JoeBlow:您可以将 (meta) 类型作为参数传递(如在您的其他问题中)或让它从上下文中推断(如在此问题中)。我不认为一种方法比另一种更好,做你最了解的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2020-03-11
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多