Swift 3需要更多信息来推断参数? [英] Swift 3 needs more info, to infer a parameter?
问题描述
我有一个向上冒泡的扩展,
但在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屋!