使用Swift的代理,闭包来封装一个公用协议减少垃圾代码
iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题……
比如说,我们先声网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多个功能呢?会变成什么样子?
所以,这样下去是绝对不行的,必须对整个乱七八糟的初始化,发送请求,请求接受进行封装,这里就会用到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的代理,闭包来封装一个公用协议减少垃圾代码的更多相关文章
- Swift 学习- 08 -- 闭包
// 闭包是自包含的函数代码块, 可以在代码中被传递和使用, swift 中的闭包 与 C语言 和 OC 中的代码块 (blocks) 以及其他一些编程语言中的匿名函数比较类似 // 闭包可以捕获和存 ...
- Swift - 简单封装一个工具类模板
创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...
- 7. Swift 基于Xmpp和openfire实现一个简单的登录注册
1. 基本步骤:首先导入Xmpp框架,配置环境 ->由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接. 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语 ...
- Swift -- 对AFN框架的封装
Swift -- 对AFN框架的封装 一.封装AFN的目的 简单的说: 解耦 日常工作中,我们一般都不会去直接使用AFNetWorking来直接发送网络请求,因为耦合性太强,假设有多个控制器都使用AF ...
- Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。
闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和 ...
- Swift学习:闭包(Closures)
/* 闭包(Closures)* 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值.* 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类 ...
- Swift中的闭包(Closure) 浅析
转载自:http://www.devtalking.com/articles/closure-expressions-in-swift/ 闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储 ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...
随机推荐
- .NET日志工具介绍
最近项目需要一个日志工具来跟踪程序便于调试和测试,为此研究了一下.NET日志工具,本文介绍了一些主流的日志框架并进行了对比.发表出来与大家分享. 综述 所谓日志(这里指程序日志)就是用于记录程序执行过 ...
- QT里嵌入Python
刚看到一个软件,叫做,明明是QT做的,却带了很多pyd文件(Python编译后的文件),上网一查,果然有这套相关的东西: https://doc.qt.io/archives/qq/qq23-pyth ...
- Delphi获取当前系统时间(使用API函数GetSystemTime)
在开发应用程序时往往需要获取当前系统时间.尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题. 在<融会贯通--Delphi4.0实战技巧>(以下简称“该书” ...
- GDB单步调试程序
linux下gdb单步调试 用 GDB 调试程序 GDB 概述———— GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 ...
- cdoj 排名表 拓扑排序 排名输出 贪心
//并不理解为什么需要反向建图,由大到小倒序确定排名.感觉正向由小到大和反向由大到小应该是一样的. 解:拓排+贪心,反向建边,先找排名靠后的(now,不知道为什么) #include<cstdi ...
- Jquery操作-(多种实例)--未完
一.Jquery简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. jQuery对象 jQuer ...
- C# base和this[转]
new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键 ...
- 实现Android语音识别服务接口 RecognitionService的方法
之前的一篇文章介绍过SpeechRecognizer类,该类能够作为对外的一个接口,并通过Intent传递一个ComponentName获取可支持语音识别的功能的服务,一般的用户手机中假设安装了语音识 ...
- JavaScript、JSP、Java及javaEE
对JavaScript.JSP.Java及javaEE之间区别的理解 JavaScript和Java名字极为类似,相信不少的初学者或者准备学这些知识的人对于JavaScript.JSP.Java及Ja ...
- 如何用SQL操作数据------告别标题党
额,首先跟大家道一个歉,由于本人上次利用标题来骗访问,对各位大哥大姐,叔叔阿姨,弟弟妹妹,and舅子老表的时间及流量造成了严重的浪费,本人深表歉意(好吧,其实本人内心还是有那么一丢丢的自豪的,毕竟是一 ...