1. 程式人生 > >ios面向切面AOP(下) swift版本

ios面向切面AOP(下) swift版本

根據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)
    }
}