と言っても、NSObjectを継承したクラスである必要があります。なので、Viewに関しての部品では用途は多いと思います。DictionaryやArrayなどNSObjectを継承していないクラスでは、使えません。
Method Swizzlingとは
MethodAとMethodBを入れ替えることができます。Appleのフレームワークで定義されたメソッドも変更できるので強力ですが、副作用(別の場所で既存メソッドを利用しようと思ったのに、書き換えられたメソッドが実行されてしまう)にも注意する必要があります。
コードで説明
今回は、NSDictionaryを利用したケースで説明します。今回は、description
を実行する際に、ログを表示する例です。まず、Extensionで実行したいメソッドを書きます。返り値は自由ですが、今回は元のメソッドの返り値を返そうと思いました。
extension NSDictionary {
func myDescription() -> String {
println("MY DESCRIPTION!!")
return myDescription()
}
}
そして、Extensionで拡張されたNSDictionaryを生成し、メソッドを入れ替えて、description
を出力してみます。
func swizzle() {
var dict = ["This is Key.": "This is value."] as NSDictionary
var method: Method = class_getInstanceMethod(object_getClass(dict), "description")
var swizzledMethod: Method = class_getInstanceMethod(object_getClass(dict), "myDescription")
method_exchangeImplementations(method, swizzledMethod)
println(dict.description)
}
下記のようなログが出ました!
MY DESCRIPTION!!
{
"This is Key." = "This is value.";
}
dictのdescription
メソッドはprintln実行時には既にmyDescription()
に切り替わっているので、このように出来たのでした。ちょっとややこしいのですが、myDescription()
のブロックで実行している、myDescription()
は既にdescription
と入れ替わっているので、myDescription()
をmyDescription()
内部で実行すると、description
の結果が出力されます。