加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift Swizzled

发布时间:2020-12-14 06:51:54 所属栏目:百科 来源:网络整理
导读:objc中出于安全性和一致性考虑,用+(void)load()来实现 swift中load()方法不起作用了,在swift中写load()方法编译器会提示错误, 可以用initialize() 或者是直接写在application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [

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

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

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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读