develop
Swizzling 본문
반응형
스위즐링은 런타임에 해당 메서드를 내가 원하는 메서드로 바꿀 수 있다.
extension UIViewController {
@objc private func customViewWillAppear(_ animated: Bool) {
print("customViewWillAppear 호출")
}
public static func swizzleMethodInitialize() {
let originalSelector = #selector(viewWillAppear(_:))
let swizzledSelector = #selector(customViewWillAppear(_:))
let originalMethod = class_getInstanceMethod(UIViewController.self, originalSelector)
let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzledSelector)
if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UIViewController.swizzleMethodInitialize()
return true
}
}
이렇게 하면 UIViewController에서 viewWillAppear가 호출이 될때 내가 만든 메서드가 호출이 된다.
Swizzling할 메서드의 Selector를 가져온다.
let originalSelector = #selector(viewWillAppear(_:))
let swizzledSelector = #selector(customViewWillAppear(_:))
UIViewController 클래스의 인스턴스메서드를 가져온다.
let originalMethod = class_getInstanceMethod(UIViewController.self, originalSelector)
let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzledSelector)
originalMethod와 swizzledMethod를 바꾼다.
method_exchangeImplementations(originalMethod, swizzledMethod)
주의할점
1. firebase, analytics 등의 프레임워크에서 스위즐링을 이미 사용하고 있을 수 있다.
2. 디버깅하기가 어려워진다.
반응형
'iOS' 카테고리의 다른 글
Subscript Optional (0) | 2021.01.02 |
---|---|
Subscript (0) | 2021.01.01 |
IBDesignable, IBInspectable (0) | 2020.12.30 |
Image Face Detector 사진에서 얼굴 찾기 (0) | 2020.12.30 |
Text Gradation 텍스트에 그라데이션 추가 (0) | 2020.12.29 |
Comments