Swiftのselector
1575 ワード
最近『Swifter-100個Swift必須tips』という本を読んでいます.ここにいくつかの思考を記録します.まず一つ目はコリー化についてですこの文章の前のはまだ理解していますが、後ろの例を見たばかりのとき、私は愚かな顔をしていました.今、この例の著者の原文と結びつけて考えを整理します.
一例
この例では、属性とメソッドを持つクラスを定義します.一般的に呼び出しメソッドはこうです.
しかし、このように呼び出すこともできます.
ここでdepositorという変数のタイプは
まとめ
上の例を見れば本の最後の例が理解できる.
この構造体のactionは、インスタンスを受信して関数を返す関数を表します.実行時にtargetに転送され、targetを実行する方法.
さらに
アップルはswift 3でSelectorを最適化し,新しいSelectorを生成する方法を提供し,コンパイル時に作成し,コンパイラは方法や属性の存在を調べることができる.
使用中にこの方法を使うことをお勧めします.以前の直接文字列でselectorを作成するのではなく、
一例
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を作成するのではなく、