首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速使用块/闭锁

如何快速使用块/闭锁
EN

Stack Overflow用户
提问于 2015-07-18 11:51:53
回答 5查看 5.8K关注 0票数 6

在我的一个应用程序中,我使用块来调用webservice并获得响应。现在我想写这个应用程序的迅速,但我遇到麻烦,使用块/关闭在swift。以下是我想快速迁移的目标C代码:

调用通信器的类方法

代码语言:javascript
复制
[[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
}];

在通信器类

代码语言:javascript
复制
-(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);
   }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-18 12:18:26

为了斯威夫特。对id objc类型使用AnyObject。

代码语言:javascript
复制
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)
    }
}

UPDATE:想要调用web service的一个例子。见下面的代码

代码语言:javascript
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2015-07-18 12:20:24

您的代码可能如下所示:

代码语言:javascript
复制
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]代替了[String : AnyObject]。如果您可以用更具体的类型替换AnyObject的任何用途,您的代码就会更干净和更稳定。

票数 3
EN

Stack Overflow用户

发布于 2015-07-18 12:06:23

对于Swift 闭包,我们必须使用( ) -> ( )

例如:

代码语言:javascript
复制
func yourFunction(success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void) {

}

你可以称之为:

代码语言:javascript
复制
yourFunction({(response) -> Void in
    // Success
}) { (error) -> Void in
    // Handle Errors
}

希望它能帮助您根据需求创建闭包。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31490866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档