2016-10-03 1 views
2

私は、上向きに泡の拡張子を持つSwift 3では、パラメータを推測するためにさらに情報が必要ですか?

が、スウィフト3に、

ジェネリックパラメータ 'T' を用いると、可能性、スウィフト< 3で

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/ 

を推測することができませんでしたこのように使用してください:

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

私はSwift 3ではなぜそれが推論されないのか分かりませんが、(b)無限のバリエーションを無限に試しても、Swift 3で動作させることはできません。 O

答えて

3

これは、既存のnextメソッドUIResponderと名前の衝突であり、拡張メソッドです。 self.next inside あなたのメソッドは、(ジェネリック)メソッド自体を参照しています。

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

本当に*何*:拡張子の名前を変更

はそれをコンパイルします変わったのは、関数に名前のない引数を加えることです。たとえば 'public func next (_:Void =()) - > T?'のようになります。コンパイラは、同じ名前のプロパティと引数のないメソッドのあいだを明確にすることはできないようです(この場合、キャストまたは型推論によって曖昧さを解消できない理由がわかりません) – Hamish

+0

@Hamish :Swift 2と3の両方で、計算されたプロパティ 'var foo'と' func foo() - > Int'の両方が "無効な宣言"で失敗すると宣言しています。 –

+0

私の他のトリッキーな拡張を許可する必要があります。あなたが修正する必要があった... http://stackoverflow.com/questions/39835397 ...私はここでメタタイプを使用する必要はない理由が混乱しています。 (あるいは実際には 'if let'とは対照的にメタタイプのアプローチを使って書くことができます) – Fattie

関連する問題