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等。
网友评论