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년전 질문