一、适配Swift3.0遇到的问题
1. Any vs AnyObject
Swift 3 针对 Any 和 AnyObject 做了更清晰的定义:Any 可以代表 struct、class、func 等等几乎所有类型,而 AnyObject 只能代表 class 生成的实例。
所以何时用 Any 何时用 AnyObject 就显而易见了。常见的情况下,我们在遇到 struct 时用 Any,class 时用 AnyObject 即可。
2. Protocol 实现一定要在对应的 extension 里
好在自己之前写代码时比较规范,没有遇到这种问题,但还是要注意下,并在此感谢@图拉鼎 的分享
在 Swift 3.0 下,如果你在一个 extension 里实现一个 protocol,那么这个 protocol 的方法一定要在这个 extension 里面能找到,而不能在另外一个 extension 里或者主 class 或 struct 里面。不然会有类似这样的警告:
Objective-C method 'tableView:canEditRowAt:' provided by method 'tableView(_:canEditRowAt:)' does not match the requirement's selector ('tableView:canEditRowAtIndexPath:')
这也是 Swift 3 编译变得更严格的一个表现。
3. 协议中的可选方法 optional fun
在swift3.0中规定,对于协议中选择性实现的方法,是一个Obhective-C兼容性特征,故需要在前面添加“@ objc”
@objc optional func 自己的方法名
二、对Alamofire的简单封装
Alamofire非常屌,先送上传送门。
这次在适配swift3.0时,发现Alamofire的方法已经变了,因为项目不算大,替换也不算多复杂,为了后期维护更加方便,干脆封装了一个工具类。下面直接上轮子(后期会逐渐完善)
本次主要是针对GET和POST请求做了一个包装壳,支持JSON和XML
// Created by 梁志远 on 16/8/24.
// Copyright © 2016年 ****. All rights reserved.
//
import UIKit
import Alamofire
enum returnDataType {
///json数据
case JSON
///xml数据
case XML
}
class ZYNetworkTools{
/// 发送POST请求
class func POST_Request(_ urlString : String, params : [String : String]? = nil, returnDataType: returnDataType, finishedCallback : @escaping (_ responseObject : Any)->()) {
let messagename = params?["messagename"] ?? "无名氏"
switch returnDataType {
case .JSON:
Alamofire.request(urlString, method: .post, parameters: params, encoding: URLEncoding.default).responseJSON { (response) in
//打印请求地址
debugPrint(message: "请求\(messagename):\(response.request!)")
//获取结果
guard let result = response.result.value else {
debugPrint(message: "请求\(messagename)失败原因:\(response.result.error)")
return
}
// 将结果回调出去
finishedCallback(result)
}
default:
Alamofire.request(urlString, method: .post, parameters: params, encoding: URLEncoding.default).responseData(completionHandler: { (responseXML) in
//打印请求地址
debugPrint(message: "请求\(messagename):\(responseXML.request!)")
//获取结果
guard let resultXML = responseXML.result.value else {
debugPrint(message: "请求\(messagename)失败原因:\(responseXML.result.error)")
return
}
// 将结果回调出去
finishedCallback(resultXML)
})
}
}
/// 发送GET请求
class func GET_Request(_ urlString : String, params : [String : String]? = nil, returnDataType: returnDataType, finishedCallback : @escaping (_ responseObject : Any)->()) {
let messagename = params?["messagename"] ?? "无名氏"
switch returnDataType {
case .JSON:
Alamofire.request(urlString, method: .get, parameters: params, encoding: URLEncoding.default).responseJSON { (response) in
//打印请求地址
debugPrint(message: "请求\(messagename):\(response.request!)")
//获取结果
guard let result = response.result.value else {
debugPrint(message: "请求\(messagename)失败原因:\(response.result.error)")
return
}
// 将结果回调出去
finishedCallback(result)
}
default:
Alamofire.request(urlString, method: .get, parameters: params, encoding: URLEncoding.default).responseData(completionHandler: { (responseXML) in
//打印请求地址
debugPrint(message: "请求\(messagename):\(responseXML.request!)")
//获取结果
guard let resultXML = responseXML.result.value else {
debugPrint(message: "请求\(messagename)失败原因:\(responseXML.result.error)")
return
}
// 将结果回调出去
finishedCallback(resultXML)
})
}
}
}