适配 Swift 3 的一点小经验、Alamofire的简单封装

一、适配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)
            })
        }
        
    }

}

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容