-
Swift SwizzlingSwift 2021. 7. 16. 17:35
ios Developer 오픈 채팅방에서 Swizzling에 대한 내용이 나와, 프로젝트에 살짝 도입해본적이 있는 해당 내용을 적어보도록 하겠다.
Method Swizzling
: 런타임에 정적으로 메소드를 호출할때 중간에 가로채서 커스텀 한 뒤 호출할 수 있게 한다.
쓰는 경우?
- 앱에 분석 기능을 통합할때(?
우리 앱에 GA(Google Analytics)를 붙인다고 할때, 화면을 시작하는 viewWillAppear 메소드 안에 GA API를 호출한다.
수백개의 viewController에 직접 넣을 수 없으니 method 를 커스텀 하겠다는 것이다.
- 로그를 넣거나, 급하게 UILabel에 어떤 값을 공통으로 해야된다던지 등등,,,
- 무언가 동일한 동작
사용방법
아래는 viewWillDisappear를 method swizzling 한 예시이다.
extension UIViewController { @objc func viewWillDisappearOverride(_ animated: Bool) { self.viewWillDisappearOverride(animated) //Incase we need to override this method if self.isMovingFromParent { SpinnerManager.shared.stopSpinner() } } static func swizzleViewWillDisappear() { //Make sure This isn't a subclass of UIViewController, So that It applies to all UIViewController childs if self != UIViewController.self { return } let originalSelector = #selector(UIViewController.viewWillDisappear(_:)) let swizzledSelector = #selector(UIViewController.viewWillDisappearOverride(_:)) guard let originalMethod = class_getInstanceMethod(self, originalSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else { return } method_exchangeImplementations(originalMethod, swizzledMethod) } } //To activate it - just call UIViewController.swizzleViewWillDisappear() from AppDelegate from inside didFinishLaunchingWithOptions
위의 코드를 실행하기 위해서는
AppDelegate에
UIViewController.swizzleViewWillDisappear()
위 코드를 작성하면 된다.
짧은 결론
하지만 이는 임시 방편으로 사용된다고 봐야할것 같다.
더 좋은 방식으로 추후 리팩토링 하는것이 좋다. (Custom Class를 상속받는 식으로 한다던지)
출처 : swizzleViewWillDisappear.swift (github), https://zeddios.tistory.com/554
728x90'Swift' 카테고리의 다른 글
ios 웹뷰와 통신 (Native <-> JavaScript 통신) (0) 2021.07.21 Combine (0) 2021.07.20 Swift Async / Await (0) 2021.07.09 Swift Thread 처리에 대해 (Operation Queue vs Dispatch Queue) (0) 2021.07.07 URL Session 에 대해서 (0) 2021.07.06