• Là cách override method có sẵn của thư viện iOS. Cụ thể hơn là cách bạn có thể thay thế 1 method có sẵn bằng một method khác.
  • Giải quyết hạn chế của extensions (Categories trong Objective-C)

Bản chất: Sử dụng objective-c runtime, thư viện hỗ trợ các API để switch các selectors. Vấn đề phát sinh: Thư viện được cập nhật mới và có thay đổi ở method bạn sử dụng. Khi đó đòi hỏi bạn sẽ phải sửa khá là nhiều và mất thời gian.

Ví dụ: Ví dụ dưới đây thực hiện swizzling method viewWillAppear của UIViewController được viết bằng Swift4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private let swizzling: (UIViewController.Type) -> () = { viewController in

let originalSelector = #selector(viewController.viewWillAppear(_:))
let swizzledSelector = #selector(viewController.proj_viewWillAppear(animated:))

let originalMethod = class_getInstanceMethod(viewController, originalSelector)
let swizzledMethod = class_getInstanceMethod(viewController, swizzledSelector)

if let originalMethod = originalMethod,
let swizzledMethod = swizzledMethod {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}


extension UIViewController {
static let classInit: Void = {
swizzling(UIViewController.self)
}()

// MARK: - Method Swizzling
@objc func proj_viewWillAppear(animated: Bool) {
self.proj_viewWillAppear(animated: animated)

let viewControllerName = NSStringFromClass(type(of: self))
print("viewWillAppear: \\(viewControllerName)")
}
}

// Call init in AppDelegate
class AppDelegate: UIResponder, UIApplicationDelegate {
override init() {
super.init()

UIViewController.classInit
}
}