Swift - 异步执行闭包 | Closure use of non-escaping parameter 'xxx' may allow it to esc

407 阅读1分钟

新版的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
         }
     }

 */