闭包参数列表的上下文类型需要 1 个参数,但指定了 4 个

Posted

技术标签:

【中文标题】闭包参数列表的上下文类型需要 1 个参数,但指定了 4 个【英文标题】:Contextual type for closure argument list expects 1 argument, but 4 were specified 【发布时间】:2015-10-28 06:31:26 【问题描述】:

我升级到 Xcode 7,我正在使用 Alamofire 管理 API 调用,我收到此错误:

''

对于以下代码:

 static func loginWithEmail(email: String, password: String, response: (token: String?) -> ()) 
    let urlString = baseURL + ResourcePath.login.description
    let parameters = [
        "email": email,
        "password": password
    ]
    Alamofire.request(.POST, urlString, parameters: parameters).responseJSON  (_, _, data, _) -> Void in
        let json = JSON(data!)
        let token = json["token"].string
        response(token: token)
    

错误是指以下行:

  Alamofire.request(.POST, urlString, parameters: parameters).responseJSON  (_, _, data, _) -> Void in

我是 swift 闭包的新手,不知道是否必须嵌套这些值才能使其有效。

非常感谢您的帮助。

【问题讨论】:

你看过Alamofire 3.0 Migration Guide,特别是“Breaking API Changes”部分吗? 【参考方案1】:

闭包采用 Response 类型的单个参数,因此您的代码应该看起来更像这样。

Alamofire.request(.POST, urlString, parameters: parameters).responseJSON  response in
    let json = JSON(response.data!)
    let token = json["token"].string
    response(token: token)

【讨论】:

完成处理程序呢?【参考方案2】:

感谢您的帮助,这是我第一次在这里提问,这很有帮助和鼓舞人心。最终代码如下所示:

    static func loginWithEmail(email: String, password: String, func_response: (token: String?) -> ()) 
    let urlString = baseURL + ResourcePath.login.description
    let parameters = [
        "email": email,
        "password": password
    ]
    Alamofire.request(.POST, urlString, parameters: parameters).responseJSON  response in
        if response.result.isSuccess 
            let json = JSON(response.result.value!)
            let token = json["token"].string
            func_response(token: token)
        
    

【讨论】:

以上是关于闭包参数列表的上下文类型需要 1 个参数,但指定了 4 个的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2 Json Alamofire 错误“..expects 1 个参数,但指定了 3 个”iOS 9 Xcode 7

如何修复上下文闭包类型 '((String, JSON), (String, JSON)) -> Bool' 需要 2 个参数,但在闭包体中使用了 1 个?

Groovy闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )

上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中

使用 2 个类型参数声明类型“StateNotifierProvider”,但给出了 1 个类型参数

使用 2 个类型参数声明类型“StateNotifierProvider”,但给出了 1 个类型参数