33
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SwiftでMethod Swizzling

Last updated at Posted at 2015-01-24

と言っても、NSObjectを継承したクラスである必要があります。なので、Viewに関しての部品では用途は多いと思います。DictionaryやArrayなどNSObjectを継承していないクラスでは、使えません。

Method Swizzlingとは

MethodAとMethodBを入れ替えることができます。Appleのフレームワークで定義されたメソッドも変更できるので強力ですが、副作用(別の場所で既存メソッドを利用しようと思ったのに、書き換えられたメソッドが実行されてしまう)にも注意する必要があります。

コードで説明

今回は、NSDictionaryを利用したケースで説明します。今回は、descriptionを実行する際に、ログを表示する例です。まず、Extensionで実行したいメソッドを書きます。返り値は自由ですが、今回は元のメソッドの返り値を返そうと思いました。

NSDictionary.swift
extension NSDictionary {
    func myDescription() -> String {
        println("MY DESCRIPTION!!")
        return myDescription()
    }
}

そして、Extensionで拡張されたNSDictionaryを生成し、メソッドを入れ替えて、descriptionを出力してみます。

Anyfile.swift
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)
}

下記のようなログが出ました!

console
MY DESCRIPTION!!
{
    "This is Key." = "This is value.";
}

dictのdescriptionメソッドはprintln実行時には既にmyDescription()に切り替わっているので、このように出来たのでした。ちょっとややこしいのですが、myDescription()のブロックで実行している、myDescription()は既にdescriptionと入れ替わっているので、myDescription()myDescription()内部で実行すると、descriptionの結果が出力されます。

参考

33
34
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?