Swiftのselector

1575 ワード

最近『Swifter-100個Swift必須tips』という本を読んでいます.ここにいくつかの思考を記録します.まず一つ目はコリー化についてですこの文章の前のはまだ理解していますが、後ろの例を見たばかりのとき、私は愚かな顔をしていました.今、この例の著者の原文と結びつけて考えを整理します.
一例
class BankAccount {
    var balance: Double = 0.0
    func deposit(amount: Double) {
        balance += amount
    }
}

この例では、属性とメソッドを持つクラスを定義します.一般的に呼び出しメソッドはこうです.
let account = BankAccount()
 account.deposit(100) // balance is now 100

しかし、このように呼び出すこともできます.
let depositor = BankAccount.deposit
depositor(account)(100) // balance is now 200

ここでdepositorという変数のタイプは(BankAccount) -> (Double) -> ()であり、BankAccountインスタンスを受信して別の関数を返す関数を表す.この関数のタイプは(Double) -> ()です
まとめ
上の例を見れば本の最後の例が理解できる.
struct TargetActionWrapper : TargetAction {
    weak var target: T?
    let action: (T) -> () -> ()
    func performAction() -> () {
        if let t = target {
            action(t)()
        }
    }
}

この構造体のactionは、インスタンスを受信して関数を返す関数を表します.実行時にtargetに転送され、targetを実行する方法.
さらに
アップルはswift 3でSelectorを最適化し,新しいSelectorを生成する方法を提供し,コンパイル時に作成し,コンパイラは方法や属性の存在を調べることができる.
class MyViewController {
    let button = UIButton()
    func viewDidLoad() {
        let action = #selector(MyViewController.onButtonTap)
        button.addTarget(self, action: action, for: .touchUpInside)
    }
    @objc func onButtonTap() {
        print("Button was tapped")
    }
}

使用中にこの方法を使うことをお勧めします.以前の直接文字列でselectorを作成するのではなく、