私のカスタムUIViewControllerサブクラスには、格納されたクロージャプロパティがあります。閉鎖署名はクラスの同じタイプの単一の引数を取るように定義される: キャプチャリストを使用して参照サイクルを回避する方法に関する混乱
class MyViewController {
var completionHandler : ((MyViewController)->(Void))?
// ...
}
...アイデアであり、ハンドラの引数、ビットlike the UIAlertAction initializerとして自身をバック通過オブジェクト。また
、及び便宜のために、私は工場(-ish)クラスメソッドがあります。それは次の処理を実行
class func presentInstance(withCompletionHandler handler:((MyViewController)->(Void)))
{
// ...
}
に...:
- ビューのインスタンスを作成しコントローラー
- プロパティに完了ハンドラーを割り当てます。
- 呼び出し時にトップ/ルートビューコントローラーになることをモーダルで示します。
私のビューコントローラは間違いなく漏れている:を私はdeinit()
にブレークポイントを設定するが、実行は、私は私のビューコントローラで行わことだし、それが却下されても仕方の後に、それを打つことはありません。
サイクルを回避するために、キャプチャリストを指定する方法や場所がわかりません。私が見てきたすべての例は、クロージャー本体が定義されている場所に配置されているようですが、コードをコンパイルすることはできません。
ここで私はクロージャプロパティを宣言しますか? (どう?)
var completionHandler : ((MyViewController)->(Void))? // If so, where does it go?
ここで私はクロージャパラメータを宣言していますか?
class func presentInstance(withCompletionHandler handler:((MyViewController)->(Void))) { // Again, where could it go?
ここで私は上記の関数を呼び出してクロージャー本体を渡しますか?
MyViewController.presentInstance(withCompletionHandler:{ [unowned viewController] viewController in // ... }) //^Use of unresolved identifier viewController //^Definition conflicts with previous value
self
に向けた私は実際にコール閉鎖、?これらの どれもコンパイルされません:self.completionHandler?(unowned self) self.completionHandler?([unowned self] self) self.completionHandler?([unowned self], self)