[問答コラム]All func pointers need a protocol now
1182 ワード
作者:pmst(1345614869)微博:PPPPPPPPMST
本文
質問リンク
問題の説明
Gargoyleはオブジェクト間のコールバックを実現しようとしたが、protocol+delegateの設計モードではなく、次の方法を使用した.
質問の回答
Jessyは解決策を提供しています.
まず、
本文
質問リンク
問題の説明
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 onSomeAction
にweak
キーワードを使用したい場合は、申し訳ありません.「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)
に変更した.次にmyView
のonSomeAction_get
に値を割り当てるのは、[unowned self]を使用してretain cycleが形成されないことを保証する閉パッケージ方式であり、これも問題解決の鍵である.