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