Swift Swizzled
objc中出于安全性和一致性考虑,用+(void)load()来实现 下面是在initialize() 实现的例子,修改项目中所有UIViewController的背景色 import UIKit
extension 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/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |