新版的Swift閉包做參數默認是@noescaping,不再是@escaping。所以如果函數裏異步執行該閉包,要添加@escaping。否則報錯:
. Parameter '***' is implicitly non-escaping
Escaping closure captures non-escaping parameter '***'
Closure use of non-escaping parameter 'xxx' may allow it to escape.
NetworkTools.requestData(type: .get, URL: "https://httpbin.org/get", parameter: ["name": "matsonga"]) { result, error in
print("result________: \(result)")
print("error________: \(error)")
}
NetworkTools.requestData(type: .post, URL: "https://httpbin.org/post", parameter: ["name": "matsonga"]) { result, error in
print("result________: \(result)")
print("error________: \(error)")
}
import Alamofire
import UIKit
enum MethodType {
case get
case post
}
class NetworkTools {
/// 網絡請求封裝
/// - Parameters:
/// - type: 類型 GET POST
/// - URL: 網址
/// - parameter: 參數
/// - finishCallback: 回調
class func requestData(type: MethodType,
URL: String,
parameter: [String: NSString]! = nil,
finishCallback: @escaping (_ result: Any, _ error:Any) -> Void)
{
let method = type == .get ? (HTTPMethod.get) : (HTTPMethod.post)
Alamofire.request(URL, method: method, parameters: parameter, encoding: URLEncoding.default, headers: nil).responseJSON { response in
guard let result = response.result.value else { return }
let error = response.result.error
finishCallback(result , error ?? "no error")
}
}
}
/*
您需要像下面一樣Swift發送請求
let urlString = "https://httpbin.org/get"
Alamofire.request(urlString, method: .post, parameters: ["foo": "bar"],encoding: JSONEncoding.default, headers: nil).responseJSON { response in
// if let json = response.result.value {
// print("JSON序列化的數據: \(json)")
// }
//
// if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
// print("經過UTF-8編碼的數據: \(utf8Text)")
// }
switch response.result {
case .success:
print(response)
break
case .failure(let error):
print(error)
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
帶Alamofire 5的Swift 5:
AF.request(URL.init(string: url)!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in
print(response.result)
switch response.result {
case .success(_):
if let json = response.value
{
successHandler((json as! [String:AnyObject]))
}
break
case .failure(let error):
failureHandler([error as Error])
break
}
}
*/