runtimeswiftswizzling

Swift function swizzling / runtime


Before Swift, in Objective-C I would swizzle or hook methods in a class using <objc/runtime.h>.

If anyone has any info on the topic of modifying Swift's runtime and hooking functions like CydiaSubstrate and other libraries that helped in this area, please inform me.


Solution

  • I've succeed with method swizzling in Swift. This example shows how to hook description method on NSDictionary

    My implementation:

    extension NSDictionary {
         func myDescription() -> String!{
            println("Description hooked")
            return "Hooooked " + myDescription();
        }
    }
    

    Swizzling code:

    func swizzleEmAll() {
            var dict:NSDictionary = ["SuperSecret": kSecValueRef]
            var method: Method = class_getInstanceMethod(object_getClass(dict), Selector.convertFromStringLiteral("description"))
    
            println(dict.description) // Check original description
    
            var swizzledMethod: Method = class_getInstanceMethod(object_getClass(dict), Selector.convertFromStringLiteral("myDescription"))
            method_exchangeImplementations(method, swizzledMethod)
    
            println(dict.description) //Check that swizzling works
        }
    

    Edited: This code will work for any custom Swift class that inherits from NSObject (but will not work for classes that don't.) More examples - https://github.com/mbazaliy/MBSwizzler