2017-10-11 7 views
0

私はクロージャを処理するメソッドを作成したいと思います。クロージャがメソッドの呼び出しが含まれていますし、私の閉鎖方法は、順番にそれらを実行する必要があり、例えば:このクローズアップを書くには?

when("I tap the Get Coffee button") 
{ 
    _ in 
     self.tap(p.button1) 
     self.wait(1) 
     self.tap(p.button1) 
     return true 
} 

そして、私の(簡体字)の閉鎖方法:

cannot convert value of type '(_) -> _' to expected argument type '(() -> Bool)?'

:これはエラーになり

public func when(_ name:String, closure:(() -> Bool)? = nil) 
{ 
    if let c = closure 
    { 
     _ = c() 
    } 
} 

これが機能するには、closure引数でどの型を定義する必要があるのか​​分かりません。

また、私はそれがで動作するように、閉鎖中self.参照を排除したいと思います:

when("I tap the Get Coffee button") 
{ 
    _ in 
     tap(p.button1) 
     wait(1) 
     tap(p.button1) 
     return true 
} 
+1

閉鎖はオプション作るのポイントは何ですか?クロージャを使わずに 'when'メソッドを呼び出すことはありますか? – rmaddy

+1

なぜ、戻り値を無視するだけの場合は、戻り値の型が 'Bool'のクロージャを定義するのですか? – rmaddy

+0

@maddy両方の理由があるので、私は書いた(簡略化した)。 – BadmintonCat

答えて

1

_ inを削除します。これは、クロージャにパラメータがあるが、クロージャが() -> Bool、つまりパラメータなしであることをコンパイラに伝えます。

selfを削除するには、クロージャをエスケープしないでください。すべてのオプションのクロージャはそのため閉鎖は非オプションでなければならないであろう、@escapingです:

public func when(_ name:String, closure:(() -> Bool)) { 
    _ = closure() 
} 

when("I tap the Get Coffee button") { 
    tap(p.button1) 
    wait(1) 
    tap(p.button1) 
    return true 
} 

脱出閉鎖が所有サイクル(メモリリーク)を作成することができますし、selfselfが捕獲されるだろう)のすべての使用がでなければならない理由です明示的。

+0

はい、私は知っていますが、このコードに正しい引数型を使用するように変更することを知りたいと思っています。また、 '.self'を削除するのはどうですか? – BadmintonCat

+0

それは選択肢ですか?ヒントありがとう! – BadmintonCat

1

私はあなたが欲しいものを得ると思います。私は間違っているかもしれません。

tapwaitselfなしで使用したいので、これらをクロージャのパラメータリストに必要とします。

tapの署名は(UIButton) ->()と思われ、waitの署名は(Int) ->()と思われます。

したがって、これらの2つのクロージャをクロージャに渡します。

種類が非常に複雑になっているので、私はあなたがタイプの別名を使用することをお勧め:

typealias WhenHandler = ((UIButton) ->(), (Int) ->()) -> Bool 

そして、あなたのwhen方法は、単にすることができ:

public func when(_ name:String, closure: WhenHandler) 

あなたがにself.tapself.waitを渡す必要がありますclosureのようなwhenメソッドでは、

if let c = closure 
{ 
    _ = c(self.tap, self.wait) 
} 

さて、あなたはこのようなwhenを呼び出すことができます。

when("I tap the Get Coffee button") 
{ 
    tap, wait in 
     tap(p.button1) 
     wait(1) 
     tap(p.button1) 
     return true 
} 
関連する問題