Swift Swizzled
2016-07-07 10:43
447 查看
objc中出于安全性和一致性考虑,用+(void)load()来实现
swift中load()方法不起作用了,在swift中写load()方法编译器会提示错误,
可以用initialize() 或者是直接写在application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool
下面是在initialize() 实现的例子,修改项目中所有UIViewController的背景色
新建一个项目SwiftAlbum,为了代码修改起来方便,新建了一个AppLoad.swift文件
通过print(“viewDidLoad:(NSStringFromClass(self.classForCoder))”)打印可以看到,项目中新建的UIViewController,都有一个工程名前缀,比如SwiftAlbum.XXXViewController
参考地址:http://nshipster.com/swift-objc-runtime/
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/
相关文章推荐
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Swift自定义iOS中的TabBarController并为其添加动画
- Swift编程中的泛型解析
- Swift中定义二维数组的方法及遍历方法示例
- Swift实现Selection Sort选择排序算法的实例讲解
- 简单分析Swift语言的一些基本特征
- 使用 Swift 语言编写 Android 应用入门
- 理解二叉堆数据结构及Swift的堆排序算法实现示例
- Swift与C语言指针结合使用实例
- Swift心得笔记之控制流
- 用Swift构建一个简单的iOS邮件应用的方法
- 苹果公司推出的新编程语言Swift简介和入门教程
- Swift实现iOS应用中短信验证码倒计时功能的实例分享
- 使用Swift代码实现iOS手势解锁、指纹解锁实例详解
- 探讨Swift数组和字典
- Swift中的指针操作和使用详细介绍
- Swift代码实现冒泡排序算法的简单实例