SWIFT闭包,介绍,使用(ALAMOFIRE封装 异步请求)
闭包说明:
首先说明简明扼要的说明一下:闭包,可以看做 JAVA中匿名函数。 我们来看APPLE文档: 一个函数,可以看做一个特殊的闭包 嵌套函数,是一个捕获其所在函数中上下文的闭包 闭包表达式,是一个写法奇特,可以捕获上下文变量的【匿名闭包】 那么让我们开始: 我们有这样子的一个需求:写一个API,他需要两个参数,第一个参数是一个 字符串数组,第二个参数是一个函数, 这个函数的作用是向数组中的每一个人打招呼,你可以对她说HELLO,BOY,你也可以对她说:OH,MY GOD.同时返回一个新的数组,这个数组中包含了对每个人说的话 那么我们需要怎么做呢?如果是不知道有【闭包】的情况下 ==========这里的预备知识是:高级函数,将函数作为其他函数的参数or返回值============= 那么现在我们用高级函数来写: 首先将上面的函数合并为一个:用高级函数来做 func sayHellotoeverybody(person:[String],fu:(eachPerson:String)->String)->[String]{ var newArray = [String]() for eachPerson in person { newArray.append(fu(eachPerson)) } return newArray } func sayhelloFunc(eachPerson:String)->String{ print(“hello,u are so nice(eachPerson)”) return “hello,u are so nice(eachPerson)” } 调用的时候直接用: let newArray = sayHellotoeverybody([“shan”,”wenzheng”,”xiaolin”],fu:sayhelloFunc) ================================================接下来我们用闭包来做=========== func sayHellotoeverybody(person:[String],fu:(eachPerson:String)->String)->[String]{ var newArray = [String]() for eachPerson in person { newArray.append(fu(eachPerson)) } return newArray } let newArray = sayHellotoeverybody([“dsfa”,”dsfa”,”dsaf”],fu:{(name)->String in //这里做你想要的操作,比如对他说你很漂亮或者很丑 //或者其他的业务操作 print(“u are so ugly(name)”) return “ u are so ugly (name)" }) 总结:从上面的函数来看,闭包最后的效果就是:隐藏了对每个人说话的函数,逼格更高,嘻嘻, 感觉是不是 JAVA的匿名函数呢?
//对闭包的一些补充
================ 接下来是对Alamofire的异步封装 ================ /** 方法体内部是回调方法,此方法无需设置代理
- parameter url:请求API的URL - parameter params:参数列表:哈希 - parameter getResultfunc:结果集 */ class func getAPIresult(url:String,params:Dictionary<String,AnyObject>,getResultfunc:(ifComplieted:Bool,resultString:String,resultNSDic:NSDictionary,resultNSArray:NSArray)->Void){ Alamofire.request(Method.POST,url,parameters: params,encoding: ParameterEncoding.URL,headers: nil).responseString(encoding: NSUTF8StringEncoding,completionHandler: { (Response) -> Void in if((Response.result as Result).isSuccess && Response.result.value != nil){ let stringValue = Response.result.value! if(stringValue != MessageCloud.arrayNoItem && stringValue != MessageCloud.nullItemOtherLanguage && stringValue != MessageCloud.nullItemOtherLanguage){ let nsdata = stringValue.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: true) do{ let nowdicData = try NSJSONSerialization.JSONObjectWithData(nsdata!,options: NSJSONReadingOptions.MutableContainers) as? NSDictionary if(nowdicData != nil){ //这里处理之,所有返回数据类型第一层都是字典 if(nowdicData!["state"] as! String == "1"){ if(nowdicData!["data"] as? NSArray != nil) { //数组类型的数据 getResultfunc(ifComplieted: true,resultString: stringValue,resultNSDic: NSDictionary(),resultNSArray: nowdicData!["data"] as! NSArray) }else if(nowdicData!["data"] as? NSDictionary != nil){ getResultfunc(ifComplieted: true,resultNSDic: nowdicData!["data"] as! NSDictionary,resultNSArray: NSArray()) }else{ //字符串类型的数据 let returnStr = nowdicData!["data"] as? String getResultfunc(ifComplieted: true,resultString: returnStr!,resultNSArray: NSArray()) } }else{ //返回错误数据 ERRMSG 字典中的KEY getResultfunc(ifComplieted: true,resultString: nowdicData!["errmsg"] as! String,resultNSArray: NSArray()) } } }catch let error as NSError{ //这里处理系统错误,非编码错误,例如:找不到服务器,404错误等 //这里应该返回CATCH getResultfunc(ifComplieted: true,resultString: "(error)",resultNSArray: NSArray()) } }else{ //在汽车项目中不可能存在这种情况 getResultfunc(ifComplieted: true,resultString: MessageCloud.noItem,resultNSArray: NSArray()) } }else{ //非200CODE 返回值都在这里处理,比如说 404 getResultfunc(ifComplieted: true,resultString: "非20x 返回值,应当查看Response的确切说明!",resultNSArray: NSArray()) } }) } ==============调用: AlamofiredelegateEntity.getAPIresult("(GLOBAL_IPADDRESS_API)RentalLocation/GetChargingStation",params: ["UserID":"(34)","UserLa":"(45)","UserLo":"(98)","MapLevel":"(2)"]) { (ifComplieted,resultString,resultNSDic,resultNSArray) -> Void in if(ifComplieted){ print(resultString) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |