Swift Swizzled

来源:互联网 发布:货运gps数据 编辑:程序博客网 时间:2024/05/17 06:13

objc中出于安全性和一致性考虑,用+(void)load()来实现
swift中load()方法不起作用了,在swift中写load()方法编译器会提示错误,
可以用initialize() 或者是直接写在application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool

下面是在initialize() 实现的例子,修改项目中所有UIViewController的背景色
新建一个项目SwiftAlbum,为了代码修改起来方便,新建了一个AppLoad.swift文件

import UIKitextension UIViewController {    public override class func initialize() {        // make sure this isn't a subclass        if self !== UIViewController.self {            return        }        struct DispatchToken {            static var token: dispatch_once_t = 0        }        dispatch_once(&DispatchToken.token) {            let originalSelector = #selector(UIViewController.viewDidLoad)            let swizzledSelector = #selector(self.lw_viewDidLoad)            let originalMethod = class_getInstanceMethod(self, originalSelector)            let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)            let addMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))            if addMethod {                class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))            }else {                method_exchangeImplementations(originalMethod, swizzledMethod)            }        }    }    func lw_viewDidLoad() {        print("viewDidLoad: \(NSStringFromClass(self.classForCoder))")        let albumClassName = NSStringFromClass(self.classForCoder)        if albumClassName.containsString("SwiftAlbum") {            self.view.backgroundColor = UIColor.init(colorLiteralRed: 244/255, green: 244/255, blue: 244/255, alpha: 1)        }    }}class AppLoad: NSObject {}

通过print(“viewDidLoad:(NSStringFromClass(self.classForCoder))”)打印可以看到,项目中新建的UIViewController,都有一个工程名前缀,比如SwiftAlbum.XXXViewController

参考地址:http://nshipster.com/swift-objc-runtime/

0 0
原创粉丝点击