適配 Swift 3 的一點(diǎn)小經(jīng)驗(yàn)、Alamofire的簡(jiǎn)單封裝

一、適配Swift3.0遇到的問(wèn)題

1. Any vs AnyObject

Swift 3 針對(duì) Any 和 AnyObject 做了更清晰的定義:Any 可以代表 struct、class、func 等等幾乎所有類型,而 AnyObject 只能代表 class 生成的實(shí)例。
所以何時(shí)用 Any 何時(shí)用 AnyObject 就顯而易見(jiàn)了。常見(jiàn)的情況下,我們?cè)谟龅?struct 時(shí)用 Any,class 時(shí)用 AnyObject 即可。

2. Protocol 實(shí)現(xiàn)一定要在對(duì)應(yīng)的 extension 里

好在自己之前寫代碼時(shí)比較規(guī)范,沒(méi)有遇到這種問(wèn)題,但還是要注意下,并在此感謝@圖拉鼎 的分享

在 Swift 3.0 下,如果你在一個(gè) extension 里實(shí)現(xiàn)一個(gè) protocol,那么這個(gè) protocol 的方法一定要在這個(gè) extension 里面能找到,而不能在另外一個(gè) extension 里或者主 class 或 struct 里面。不然會(huì)有類似這樣的警告:
Objective-C method 'tableView:canEditRowAt:' provided by method 'tableView(_:canEditRowAt:)' does not match the requirement's selector ('tableView:canEditRowAtIndexPath:')
這也是 Swift 3 編譯變得更嚴(yán)格的一個(gè)表現(xiàn)。

3. 協(xié)議中的可選方法 optional fun

在swift3.0中規(guī)定,對(duì)于協(xié)議中選擇性實(shí)現(xiàn)的方法,是一個(gè)Obhective-C兼容性特征,故需要在前面添加“@ objc”
@objc optional func 自己的方法名

二、對(duì)Alamofire的簡(jiǎn)單封裝

Alamofire非常屌,先送上傳送門。
這次在適配swift3.0時(shí),發(fā)現(xiàn)Alamofire的方法已經(jīng)變了,因?yàn)轫?xiàng)目不算大,替換也不算多復(fù)雜,為了后期維護(hù)更加方便,干脆封裝了一個(gè)工具類。下面直接上輪子(后期會(huì)逐漸完善)

本次主要是針對(duì)GET和POST請(qǐng)求做了一個(gè)包裝殼,支持JSON和XML

//  Created by 梁志遠(yuǎn) on 16/8/24.
//  Copyright ? 2016年 ****. All rights reserved.
//

import UIKit
import Alamofire
enum returnDataType {
    ///json數(shù)據(jù)
    case JSON
    ///xml數(shù)據(jù)
    case XML
}
class ZYNetworkTools{
    
    /// 發(fā)送POST請(qǐng)求
    class func POST_Request(_ urlString : String, params : [String : String]? = nil, returnDataType: returnDataType, finishedCallback : @escaping (_ responseObject : Any)->()) {
        let messagename = params?["messagename"] ?? "無(wú)名氏"
        switch returnDataType {
        case .JSON:
            Alamofire.request(urlString, method: .post, parameters: params, encoding: URLEncoding.default).responseJSON { (response) in
                //打印請(qǐng)求地址
                debugPrint(message: "請(qǐng)求\(messagename):\(response.request!)")
                //獲取結(jié)果
                guard let result = response.result.value else {
                    debugPrint(message: "請(qǐng)求\(messagename)失敗原因:\(response.result.error)")
                    return
                }
                // 將結(jié)果回調(diào)出去
                finishedCallback(result)
            }
        default:
            Alamofire.request(urlString, method: .post, parameters: params, encoding: URLEncoding.default).responseData(completionHandler: { (responseXML) in
                //打印請(qǐng)求地址
                
                debugPrint(message: "請(qǐng)求\(messagename):\(responseXML.request!)")
                //獲取結(jié)果
                guard let resultXML = responseXML.result.value else {
                    debugPrint(message: "請(qǐng)求\(messagename)失敗原因:\(responseXML.result.error)")
                    return
                }
                // 將結(jié)果回調(diào)出去
                finishedCallback(resultXML)
            })
        }
    }
    
    /// 發(fā)送GET請(qǐng)求
    class func GET_Request(_ urlString : String, params : [String : String]? = nil, returnDataType: returnDataType, finishedCallback : @escaping (_ responseObject : Any)->()) {
        let messagename = params?["messagename"] ?? "無(wú)名氏"
        switch returnDataType {
        case .JSON:
            Alamofire.request(urlString, method: .get, parameters: params, encoding: URLEncoding.default).responseJSON { (response) in
                //打印請(qǐng)求地址
                debugPrint(message: "請(qǐng)求\(messagename):\(response.request!)")
                //獲取結(jié)果
                guard let result = response.result.value else {
                    debugPrint(message: "請(qǐng)求\(messagename)失敗原因:\(response.result.error)")
                    return
                }
                // 將結(jié)果回調(diào)出去
                finishedCallback(result)
            }
        default:
            Alamofire.request(urlString, method: .get, parameters: params, encoding: URLEncoding.default).responseData(completionHandler: { (responseXML) in
                //打印請(qǐng)求地址
                debugPrint(message: "請(qǐng)求\(messagename):\(responseXML.request!)")
                //獲取結(jié)果
                guard let resultXML = responseXML.result.value else {
                    debugPrint(message: "請(qǐng)求\(messagename)失敗原因:\(responseXML.result.error)")
                    return
                }
                // 將結(jié)果回調(diào)出去
                finishedCallback(resultXML)
            })
        }
        
    }

}

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,872評(píng)論 0 12
  • 1、隨機(jī)數(shù) 不需要隨機(jī)數(shù)種子 arc4random()%N + begin:產(chǎn)生begin~begin+N的隨機(jī)數(shù)...
    我是小胡胡123閱讀 4,408評(píng)論 0 2
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 9,157評(píng)論 0 36
  • 春末是家里買了幾根山藥,吃的只剩了一根,放在外面的窗臺(tái)上,時(shí)間久了,忘記了。今天打開(kāi)窗,突然看見(jiàn)防盜窗上有...
    胥子衡媽媽閱讀 240評(píng)論 0 3
  • 中午,簡(jiǎn)單點(diǎn),來(lái)個(gè)海鮮面吧。 父子倆出門了,我的任務(wù)是洗菜,做面條。 面包機(jī)和完面,我搬出了面條機(jī)。 話說(shuō),這些個(gè)...
    小空同學(xué)閱讀 284評(píng)論 0 0

友情鏈接更多精彩內(nèi)容