如何在swift中使用block / closure

在我的应用程序之一,我已经使用块进行web服务调用并获得响应。 现在我想用swift编写这个应用程序,但是我在Swift中使用blocks / Closure时遇到了麻烦。 这是我想快速迁移的目标C代码: –

//调用Communicator的类方法

[[Communicator sharedInstance]callWebService:WS_LOGIN withMethod:POST_METHOD andParams:params showLoader:YES completionBlockSuccess:^(id obj) { //Do play with data }completionBlockFailiure:^(id obj) { //Show alert with error }]; 

//在传播者类

 -(void)callWebService:(NSString *)serviceName withMethod:(NSString *)methodName andParams:(NSDictionary *)params showLoader:(BOOL)showLoader completionBlockSuccess:(void (^)(id))aBlock completionBlockFailiure:(void (^)(id))aFailBlock { if (showLoader) { // show loader } [self performRequestWithServiceName:serviceName method:methodName andParams:params successblock:aBlock failureblock:aFailBlock]; } - (void)performRequestWithServiceName:(NSString *)serviceName method:(NSString*)methodName andParams:(NSDictionary*)params successblock:(void (^)(id obj))successBlock failureblock:(void (^)(id obj))failBlock { if(callSuceess){ successBlock(@"Success"); }else{ successBlock(nil); } } 

谁能帮我 ?

任何帮助,将不胜感激。

提前致谢。

对于Swift。 使用AnyObject作为id objctypes。

 func callWebservice (serviceName: String, withMethod method: String, andParams params: NSDictionary, showLoader loader: Bool, completionBlockSuccess aBlock: ((AnyObject) -> Void), andFailureBlock failBlock: ((AnyObject) -> Void)) { if loader { // Show loader } performRequestWithServiceName(serviceName, method: method, andParams: params, success: aBlock, failure: failBlock) } func performRequestWithServiceName(serviceName: String, method methodName: String, andParams params: NSDictionary, success successBlock: ((AnyObject) -> Void), failure failureBlock: ((AnyObject) -> Void)) { if callSuceess { successBlock("Success") }else { successBlock(nil) } } 

更新:当你想调用web service的例子。 看下面的代码

 callWebservice("your-service-name", withMethod: "your-method", andParams: ["your-dic-key": "your dict value"], showLoader: true/*or false*/, completionBlockSuccess: { (success) -> Void in // your successful handle }) { (failure) -> Void in // your failure handle } 

您的代码可能如下所示:

 func callWebService(serviceName: String, method: String, params: [String : AnyObject], showLoader: Bool, success: (responseObject: AnyObject) -> Void, failure: (responseObject: AnyObject) -> Void) { if showLoader { // show loader } performRequest(serviceName, method: method, params: params, success: success, failure: failure) } func performRequest(serviceName: String, method: String, params: [String : AnyObject], success: (responseObject: AnyObject) -> Void, failure: (responseObject: AnyObject) -> Void) { } 

我用[String : AnyObject]replaceNSDictionary 。 如果你可以使用更具体的typesreplaceAnyObject任何用途, AnyObject你的代码就会更干净,更稳定。

在通信类中,该方法的webservice cals将被定义这样的取决于你想要返回的对象的types

 func performRequest(serviceName: NSString, methodName: NSString,paramaters:NSDictionary, successblock: (String)->(), failureBlock: () -> ()) { if(callSuccess) { successblock("Success") } else { failureBlock() } 

在上面的例子中,我们定义了成功和失败块的types,通过它们的函数签名来定义成功被定义为一个方法,它把一个string作为input参数,并且什么都不返回,所以我们可以调用successBlock传入一个string。 失败块在上面定义为不带参数且不返回任何内容的块。

调用这个方法

 func callWebService(serviceName: NSString, method: NSString and parameters: NSDictionary, showLoader: Bool, completionBlockSuccess:(String) -> (), completionBlockFailiure:() -> ()) { if (showLoader) { // show loader } performRequest(serviceName: serviceName, methodName: method, parameters, successBlock:completionBlockSuccess, failureBlock: completionBlockFailiure) } 

最后来调用这个

 Communicator.sharedInstance().callWebService(serviceName: WS_LOGIN , method: POST_METHOD and parameters: params, showLoader: true, completionBlockSuccess:{ returnedString in //Do play with data }, completionBlockFailiure:{ //Show alert with error }) 

对于完成块,我们定义一个variablesreturnedString来允许我们操纵input参数(在上面的例子中,它将是string“Success”)。 我假设你的数据不只是返回一个string,所以你可能需要玩他们的types取决于你的服务返回。

另外在这里,我试图通过使用NSString和NSDictionary来匹配你的方法签名,虽然根据你的需要,Swift的等价的string和[String:AnyObject]可能是更合适的。

对于Swift Closures,我们必须使用() – >()

例如 :

 func yourFunction(success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void) { } 

你可以这样称呼它:

 yourFunction({(response) -> Void in // Success }) { (error) -> Void in // Handle Errors } 

希望它能帮助你创build符合你要求的闭包。