私はクロージャでカスタム関数を実装しようとしました。しかし、それは#selector
でサポートされていません。#selectorはクロージャと互換性がありませんか?
ここでは例です:
class Core: NSObject {
static let shared:Core = Core.init()
func button(viewController: UIViewController, button: UIButton, title: String, color: UIColor, completion:() -> Void) {
button.layer.cornerRadius = button.bounds.width/2
button.setTitle(title, for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.backgroundColor = color
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(viewController, action: #selector(completion()), for: .touchUpInside)
}
}
Xcodeは私に、ビルド時の問題を与える: '#selector' の
引数は '@objc' メソッド、プロパティを参照していない、または初期化子
プロパティを使用して、このような完了ハンドラを格納することは、実際には***脆弱です。スレッドセーフではなく、状態エラーが発生しやすい – Alexander
はい、これは明らかに@Mannopsonの質問に対する簡単な簡単な答えです。現在のスレッドに対する手動による検査の中には、マルチスレッドの状況で役立つものがあります。それとも、メインスレッドにとどまっても問題ありません。しかし、まずはMannopsonが正しい方向に向かうでしょう。 –
私は同意しません、これは確かに正しい方向ではありません。これは落とし穴を完全に理解していないかもしれない誰かの手にとって危険なアプローチです。私が考えることができる唯一の方法は、新しいクラスをインスタンス化し、クロージャー本体を一意のセレクタを持つメソッドとして登録することです。 – Alexander