您的位置:首页 > 移动开发 > Swift

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

2015-11-14 16:21 351 查看
根据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)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息