美文网首页iOS开发
AOP Aspects Swift实践

AOP Aspects Swift实践

作者: ShawnDu | 来源:发表于2016-03-04 22:37 被阅读1708次

    Aspect Oriented Programming (面向切面编程)

    先来看WikiPedia对AOP介绍:

    AOP is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification.

    这句话是说把一些与主逻辑无关的琐碎事务分离出来,作为独立的模块。在 Objective-C 的世界里,就可以利用 Runtime 特性给指定的方法添加自定义代码。实现 AOP 有多种方式 ,Method Swizzling(Swift中使用Method Swizzling) 是其中之一,现在有一些第三方库可以让你不需要了解 Runtime ,就能直接开始使用 AOP, 如Aspects

    Aspects使用Demo

    对所有ViewController里面viewDidLoad,都加上一些配置,可以写一个extension:

    extension UIViewController {
        func SSViewDidLoad() {
            self.navigationController?.navigationBar.translucent = true// iOS7使用appearance设置translucent会crash
            print("SSViewDidLoad")
            self.view.backgroundColor = UIColor.whiteColor()
            if self.respondsToSelector("edgesForExtendedLayout") {
                self.edgesForExtendedLayout = .None
            }
        }
    }
    

    写一个结构体AppConfig,写一个静态方法SSViewControllerConfig:

    static func SSViewControllerConfig() {
            let wrappedBlock:@convention(block) (AspectInfo)-> Void = { aspectInfo in
                let instance = aspectInfo.instance() as? UIViewController
                instance?.SSViewDidLoad()
                }
            let wrappedObject: AnyObject = unsafeBitCast(wrappedBlock, AnyObject.self)
            do {
                try UIViewController.aspect_hookSelector("viewDidLoad", withOptions: .PositionAfter, usingBlock: wrappedObject)
            } catch {
                print(error)
            }
        }
    

    然后在AppDelegate里面的AppConfig.SSViewControllerConfig()调用来看aspect_hookSelector方法,这是Aspects库提供的,注意到usingBlock后面的参数是AnyObject, 需要用unsafeBitCase对block转一下。

    后记

    Swift本身没有Runtime,是利用的 objective-C Runtime 特性。对于 Aspect Oriented Programming ,面向切面编程,能够很好的独立出模块而不影响全局逻辑,对ViewController的配置是其中一个应用,还有其它如打Log等。

    微信公众号

    开发者思维 devthinking

    相关文章

      网友评论

      • AndreaArlex:swift 如果是自己写的方法,不是系统方法,好像hook不了,这个能解决吗?

      本文标题:AOP Aspects Swift实践

      本文链接:https://www.haomeiwen.com/subject/sxiokttx.html