Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swizzling NSObject classes in Swift

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for codelynx codelynx
March 16, 2021
160

Swizzling NSObject classes in Swift

Avatar for codelynx

codelynx

March 16, 2021
Tweet

Transcript

  1. Swizzling • To be able to replace or to override

    existing NSObject methods • UIViewController viewDidAppear UIViewController myViewDidAppear viewDidAppear Before After viewDidAppear viewDidAppear
  2. 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
  3. 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) } }
  4. Consideration • Do not abuse • Apple may terminate or

    discontinue this mechanism in the future