Slide 1

Slide 1 text

Swizzing NSObject classes Kaz Yoshikawa FEB 2021

Slide 2

Slide 2 text

Swizzling • To be able to replace or to override existing NSObject methods • UIViewController viewDidAppear UIViewController myViewDidAppear viewDidAppear Before After viewDidAppear viewDidAppear

Slide 3

Slide 3 text

What’s for? • Analytics for user tracking • eg. Logging extra information of all viewDidAppear methods • Application wide behavior changes • Tap on UIButton to speech before sendAction() get invoked

Slide 4

Slide 4 text

Example func swizzleMethod(_ `class`: AnyClass, _ original: Selector, _ swizzled: Selector) { if let original = class_getInstanceMethod(`class`, original), let swizzled = class_getInstanceMethod(`class`, swizzled) { method_exchangeImplementations(original, swizzled) } else { print("failed to swizzle: \(`class`.self), '\(original)', '\(swizzled)'") } } swizzleMethod( UIViewController.self, #selector(UIViewController.viewDidAppear(_:)), #selector(UIViewController.viewDidAppear_x(_:)) ) public extension UIViewController { @objc private func viewWillAppear_x(_ animated: Bool) { print(Self.self, #function) self.viewWillAppear_x(animated) } }

Slide 5

Slide 5 text

Consideration • Do not abuse • Apple may terminate or discontinue this mechanism in the future

Slide 6

Slide 6 text

Code • https://gist.github.com/codelynx/3685e0530607746a0811dfd3d1fe ff 9e

Slide 7

Slide 7 text

Thank you