Swift封装AFN网络请求
2017-07-20 本文已影响0人
IOS开发攻城狮_Fyc
废话不多说直接上代码
import UIKit
import AFNetworking
// swift 的枚举支持任意类型
// swift / enum 在OC中只是支持整数
enum WBHTTPMethod {
case GET
case POST
}
/**
- 如果日常开发中,发现网络请求返回的状态码是 405,不支持的网络请求方法
- 首先应该查找网路请求方法是否正确
*/
class WBNetworkManager: AFHTTPSessionManager {
//静态区 / 常量 /闭包
static let shared = WBNetworkManager()
func request(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completed: @escaping (_ json: AnyObject?, _ isSuccess: Bool)->()) {
/// 定义成功回调闭包
let success = { (task: URLSessionDataTask,json: Any?)->() in
completed(json as AnyObject?,true)
}
/// 定义失败回调闭包
let failure = {(task: URLSessionDataTask?, error: Error)->() in
completed(nil,false)
}
/// 通过请求方法,执行不同的请求
// 如果是 GET 请求
if method == .GET { // GET
get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
} else { // POST
post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
}
}
}
遇到的问题
let success = { (task: URLSessionDataTask,json: Any?)->() in
completed(json as AnyObject?,true)
}
json 的类型必须是Any? 不能是AnyObject
Any 和 AnyObject的区别
AnyObject 可以代表任何 class 类型的实例
Any 可以表示任意类型,甚至包括方法 (func) 类型
从以上可以看出Any和AnyObject都是协议而且,并且从Apple提供的注释中可以看出所有的类型都隱式实现了Any协议,所有的class都隱式实现了AnyObject协议
AnyObject是Any的子集
所有用class关键字定义的对象就是AnyObject
所有不是用class关键字定义的对象就不是AnyObject,而是Any