ios面向切面AOP(下) swift版本
阿新 • • 發佈:2018-11-02
根據Objective-c版本,編寫的swift版本
新建一個Swift檔案,繼承自UIViewController.
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } extension UIViewController { public override class func initialize() { struct Static { static var token:dispatch_once_t = 0; } // if self == UIViewController.self { dispatch_once(&Static.token) { swizzleMethod(aopClass: self, originalSelector: Selector("viewDidLoad"), swizzledSelector: Selector("aop_viewDidLoad")) swizzleMethod(aopClass: self, originalSelector: Selector("viewWillAppear:"), swizzledSelector: Selector("aop_viewWillAppear:")) swizzleMethod(aopClass: self, originalSelector: Selector("viewDidAppear:"), swizzledSelector: Selector("aop_viewDidAppear:")) swizzleMethod(aopClass: self, originalSelector: Selector("viewWillDisappear:"), swizzledSelector: Selector("aop_viewWillDisappear:")) swizzleMethod(aopClass: self, originalSelector: Selector("viewDidDisappear:"), swizzledSelector: Selector("aop_viewDidDisappear:")) } // } } func aop_viewDidLoad() { self.aop_viewDidLoad() if !self.isKindOfClass(NSClassFromString("UINavigationController")!) && !self.isKindOfClass(NSClassFromString("UIInputWindowController")!) && !self.isKindOfClass(NSClassFromString("UIAlertController")!) { print("aop_viewDidLoad~~~\(self)") } } func aop_viewWillAppear(animated: Bool) { self.aop_viewWillAppear(animated) if !self.isKindOfClass(NSClassFromString("UINavigationController")!) && !self.isKindOfClass(NSClassFromString("UIInputWindowController")!) && !self.isKindOfClass(NSClassFromString("UIAlertController")!) { print("aop_viewWillAppear~~~\(self)") } } func aop_viewDidAppear(animated: Bool) { self.aop_viewDidAppear(animated) if !self.isKindOfClass(NSClassFromString("UINavigationController")!) && !self.isKindOfClass(NSClassFromString("UIInputWindowController")!) && !self.isKindOfClass(NSClassFromString("UIAlertController")!) { print("aop_viewDidAppear~~~\(self)") } } func aop_viewWillDisappear(animated: Bool) { self.aop_viewWillDisappear(animated) if !self.isKindOfClass(NSClassFromString("UINavigationController")!) && !self.isKindOfClass(NSClassFromString("UIInputWindowController")!) && !self.isKindOfClass(NSClassFromString("UIAlertController")!) { print("aop_viewWillDisappear~~~\(self)") } } func aop_viewDidDisappear(animated: Bool) { self.aop_viewWillDisappear(animated) if !self.isKindOfClass(NSClassFromString("UINavigationController")!) && !self.isKindOfClass(NSClassFromString("UIInputWindowController")!) && !self.isKindOfClass(NSClassFromString("UIAlertController")!) { print("aop_viewDidDisappear~~~\(self)") } } } func swizzleMethod(aopClass aopClass:AnyClass,originalSelector:Selector,swizzledSelector:Selector) { let originalMethod = class_getInstanceMethod(aopClass, originalSelector) let swizzledMethod = class_getInstanceMethod(aopClass, swizzledSelector) let didAddMethod = class_addMethod(aopClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if didAddMethod { class_replaceMethod(aopClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) } else{ method_exchangeImplementations(originalMethod, swizzledMethod) } }