使用Swift的代理,闭包来封装一个公用协议减少垃圾代码
2015-11-25 20:10
591 查看
iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题……
比如说,我们先声网App中为了调用接口,做简单的判断,会有如下的垃圾代码(前辈遗留下来的):
看到了吗,每个VC开头都得这样写一发,如果我们有20多个功能呢?会变成什么样子?
![](http://upload-images.jianshu.io/upload_images/135434-ac989bcabeef7436.png)
坑爹的功能列表
所以,这样下去是绝对不行的,必须对整个乱七八糟的初始化,发送请求,请求接受进行封装,这里就会用到Swift最有用的协议,代理,以及闭包了。
这个首先通过协议和代理,闭包放在下一篇。
协议,顾名思义,也就是其他语言里面的接口(C++的抽象类也差不多)
由于Swift不支持普通类型(Int之流)设置为Static,类
方法如果是静态,必须加class关键字(我觉得这个很有槽点),只有Struct和Enum可以直接用Static(也有小Tip可以用Struct包
裹一个普通类型,设为计算类型,然后充当一个Static成员,但是这里不讲了)
我们首先可以这样封装简单的初始化方法……
OK?那个HttpController是另一个接口,来进行网络操作的,代理需要靠它,所以我们返回一个HttpController实例,如果失败就返回nil,在实际VC里面加一个解包判断即可。
以后,想要初始化,就只需要这样了
把一群乱七八糟的代码扔走。下一步就是如果用代理来代理我们所有的请求以及相应的结果了,下一篇文章补上……
比如说,我们先声网App中为了调用接口,做简单的判断,会有如下的垃圾代码(前辈遗留下来的):
override func viewDidLoad() { super.viewDidLoad() var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1) self.navigationController?.navigationBar.barTintColor = color self.httpController.delegate = self Config.shareInstance().isNetworkRunning = CheckNetwork.doesExistenceNetwork() if Config.UUID == nil || Config.UUID!.isEmpty { Tool.showErrorHUD("去信息门户登录一下吧:)") } else if !Config.shareInstance().isNetworkRunning { Tool.showErrorHUD("貌似你没有联网哦") } else { Tool.showProgressHUD("正在更新校园网信息") sendNicAPI() } // Do any additional setup after loading the view. } func sendNicAPI(){ let nicURL = "http://herald.seu.edu.cn/api/nic" let parameter:NSDictionary = ["uuid":Config.UUID!] self.httpController.postToURLAF(nicURL, parameter: parameter, tag: "nic") } func didReceiveDicResults(results: NSDictionary, tag: String) { if let content:NSDictionary = results["content"] as? NSDictionary{ if tag == "nic"{ firstSend = false Tool.showSuccessHUD("获取信息成功") println(content.allKeys) } } }
看到了吗,每个VC开头都得这样写一发,如果我们有20多个功能呢?会变成什么样子?
![](http://upload-images.jianshu.io/upload_images/135434-ac989bcabeef7436.png)
坑爹的功能列表
所以,这样下去是绝对不行的,必须对整个乱七八糟的初始化,发送请求,请求接受进行封装,这里就会用到Swift最有用的协议,代理,以及闭包了。
这个首先通过协议和代理,闭包放在下一篇。
协议,顾名思义,也就是其他语言里面的接口(C++的抽象类也差不多)
由于Swift不支持普通类型(Int之流)设置为Static,类
方法如果是静态,必须加class关键字(我觉得这个很有槽点),只有Struct和Enum可以直接用Static(也有小Tip可以用Struct包
裹一个普通类型,设为计算类型,然后充当一个Static成员,但是这里不讲了)
我们首先可以这样封装简单的初始化方法……
class func initNavigationAPI(VC:UIViewController,navBarColor:UIColor) -> HttpController?{ var httpController:HttpController = HttpController() VC.navigationController?.navigationBar.barTintColor = navBarColor Config.shareInstance().isNetworkRunning = CheckNetwork.doesExistenceNetwork() if Config.UUID == nil || Config.UUID!.isEmpty{ Tool.showSuccessHUD("请在边栏的个人资料中补全您的信息") } else if !Config.shareInstance().isNetworkRunning{ Tool.showErrorHUD("貌似你没有联网哦") } else{ Tool.showProgressHUD("正在获取信息") return httpController } return nil }
OK?那个HttpController是另一个接口,来进行网络操作的,代理需要靠它,所以我们返回一个HttpController实例,如果失败就返回nil,在实际VC里面加一个解包判断即可。
以后,想要初始化,就只需要这样了
override func viewDidLoad() { super.viewDidLoad() var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1) self.httpController = Tool.initNavigationAPI(self,navBarColor: color) ?? nil if (self.httpController != nil){ self.httpController!.delegate = self Tool.sendAPI("cardDetail", httpController: self.httpController!) } }
把一群乱七八糟的代码扔走。下一步就是如果用代理来代理我们所有的请求以及相应的结果了,下一篇文章补上……
相关文章推荐
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- 通过AVFoundation获取摄像头数据[Swift]
- 原生Base64编码/解码(OC与Swift)
- swift析构方法和扩展
- swift中基本运算符的一些特性
- 基本数据类型之字符串
- swift学习笔记-2
- swift构造方法
- Swift学习之路 -- 函数和闭包
- 《swift2.0 官方教程中文版》 第2章-08枚举
- Swift语言iOS8的蓝牙Bluetooth解析
- Swift/IOS 场景切换之prepareSegue
- Swift中GCD的使用
- Swift之贪婪的UIButton
- 不要用子类!Swift的核心是面向协议
- 怎样在swift中创建一个CocoaPods
- 何时使用Swift Structs和Classes
- 窥探Swift之新添数据类型元组与可选值
- 读懂Swift 2.0中字符串设计思路的改变
- 窥探Swift之别样的枚举类型