我有一个向上冒泡的扩展,
但在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
中运行答案 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
}
}