[問答コラム]All func pointers need a protocol now

1182 ワード

作者:pmst(1345614869)微博:PPPPPPPPMST
本文
質問リンク
問題の説明
Gargoyleはオブジェクト間のコールバックを実現しようとしたが、protocol+delegateの設計モードではなく、次の方法を使用した.
final class MyView: UIView {  
    var onSomeAction: ((String) -> Void)!  
}  
  
final class MyViewController: UIViewController {  
    let myView = MyView(frame: CGRectZero)  
    override func viewDidLoad() {  
        super.viewDidLoad()  
        myView.onSomeAction = someFunc  
    }  
  
    private func someFunc(str: String) {  
    }  
}  
myViewControllerインスタンスとmyViewインスタンスがretain cycleを形成することに注意してください.var onSomeActionweakキーワードを使用したい場合は、申し訳ありません.「weak cannot be applied to non-class type xxxx」とエラーが発生しました.class以外のオブジェクトではweakキーワードを使用できないことは明らかです.
質問の回答
Jessyは解決策を提供しています.
var onSomeAction_get: () -> (String -> Void)! = {nil} 

myView.onSomeAction_get = {[unowned self] in self.someFunc} 

まず、(String) -> Voidから() -> (String -> Void)に変更した.次にmyViewonSomeAction_getに値を割り当てるのは、[unowned self]を使用してretain cycleが形成されないことを保証する閉パッケージ方式であり、これも問題解決の鍵である.