Swift:如何将闭包参数从 class 方法传递给 class 中的函数

Swift: How to pass closure argument from a class method to a function in the class

我在我的应用程序中定义了这个 class 来处理对我的后端的请求

class BackendService {      
    // Retrieves user chat channels
    class func getChatChannels(success:(response: Response)->(), failure: (response:Response)->()) {        
        let chatsURL = baseURL + "/chats"
        performRequestWith(success, failure: failure, url: chatsURL, parameters: nil)
    }

    func performRequestWith(success:(response: Response)->(), failure: (response: Response) -> (), url: String, parameters: String?) {
        var manager = Alamofire.Manager.sharedInstance

        let keychain = Keychain(service:"com.domain.app")
        let token = keychain.get("token")

        if let token = token {            
            manager.session.configuration.HTTPAdditionalHeaders = ["Authorization": "Bearer \(token)"]

            manager.request(.GET, url, parameters:nil).responseJSON { (req, res, json, err) in

                if(err != nil) {                    
                    var response = Response()
                    response.error = err
                    failure(response: response)                    
                } else {                    
                    var response = Response()

                    if let httpStatus = HTTPStatus(rawValue: res!.statusCode) {
                        response.httpStatus = httpStatus
                    }

                    response.payload = JSON(json!)
                    success(response: response)
                }
            }            
        }
    } 
}

我正在尝试将 getChatChannels 收到的 callback/closure 个参数传递给 performRequestWith。在 performRequestWith(success, failure: failure, url: chatsURL, parameters: nil) 我得到 Extra argument 'failure' in call

我对 Swift 没有什么经验,我显然在这里做错了一些事情。非常感谢您的帮助。

您的方法调用代码没有问题。 问题是您正在从 class 方法调用实例方法。

或者您应该将这两种方法都更改为 class 方法,例如:

class func getChatChannels(success:(response: Response)->(), failure: (response:Response)->())
{        
    let chatsURL = baseURL + "/chats"
    performRequestWith(success, failure: failure, url: chatsURL, parameters: nil)
}

class func performRequestWith(success:(response: Response)->(), failure: (response: Response) -> (), url: String, parameters: String?)
{
    // Your code
}

或将两者都更改为实例方法,例如:

func getChatChannels(success:(response: Response)->(), failure: (response:Response)->())
{        
    let chatsURL = baseURL + "/chats"
    performRequestWith(success, failure: failure, url: chatsURL, parameters: nil)
}

func performRequestWith(success:(response: Response)->(), failure: (response: Response) -> (), url: String, parameters: String?)
{
    // Your code
}

另一种选择是在 class 方法中创建 class 的实例,并使用该实例调用实例方法。