[Swift] NSObject 메서드 교체

swift nsobject swizzle

Swift에서 NSObject 하위 클래스의 메서드 낚아채기

//  MBSwizzler.swift
//  SwizzlingExample
//
//  Created by Max Bazaliy on 6/5/14.
//  Copyright (c) 2014 Home. All rights reserved.
//

import Foundation

extension NSObject {
    
    class func swizzleMethodSelector(origSelector: String!, withSelector: String!, forClass:AnyClass!) -> Bool {
        let originalSelector = Selector(origSelector)
        let swizzledSelector = Selector(withSelector)
        
        let originalMethod = class_getInstanceMethod(forClass, originalSelector)
        let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)
        
        if originalMethod != nil && swizzledMethod != nil {
            if class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) {
                class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
            }
            else {
                method_exchangeImplementations(originalMethod, swizzledMethod)
            }
            return true
        }
        
        return false
    }
    
    class func swizzleStaticMethodSelector(origSelector: String!, withSelector: String!, forClass:AnyClass!) -> Bool {
        let originalSelector = Selector(origSelector)
        let swizzledSelector = Selector(withSelector)
        
        let originalMethod = class_getClassMethod(forClass, originalSelector)
        let swizzledMethod = class_getClassMethod(forClass, swizzledSelector)
        
        if originalMethod != nil && swizzledMethod != nil {
            if class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) {
                class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
            }
            else {
                method_exchangeImplementations(originalMethod, swizzledMethod)
            }
            return true
        }
        
        return false
    }
}

유승훈 7년전 질문


댓글 0

댓글작성

목록보기