Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带completionHandler的块的Swift语法。。。在委托方法中_Ios_Objective C_Closures_Block_Swift - Fatal编程技术网

Ios 带completionHandler的块的Swift语法。。。在委托方法中

Ios 带completionHandler的块的Swift语法。。。在委托方法中,ios,objective-c,closures,block,swift,Ios,Objective C,Closures,Block,Swift,这是常规NSURLSession完成块问题的一个折痕,我花了很长时间才将其解析为Swift语法。该方法是身份验证委托回调,在auth质询时调用;开发人员使用NSURLCredential、NSError调用完成块 Objective-C方法如下所示: -(void) provideUsernamePasswordForAuthChallenge:(NSURLAuthenticationChallenge *)authChallenge completionHandler:(void (^)(NS

这是常规NSURLSession完成块问题的一个折痕,我花了很长时间才将其解析为Swift语法。该方法是身份验证委托回调,在auth质询时调用;开发人员使用NSURLCredential、NSError调用完成块

Objective-C方法如下所示:

-(void) provideUsernamePasswordForAuthChallenge:(NSURLAuthenticationChallenge *)authChallenge completionHandler:(void (^)(NSURLCredential *, NSError *))completionHandler{

    NSURLCredential* credential = [NSURLCredential credentialWithUser:@"myname" 
                                                             password:@"mypass" 
                                                          persistence:NSURLCredentialPersistenceForSession];
    completionHandler(credential, nil);
}
我认为我在斯威夫特最接近的是:

func provideUsernamePasswordForAuthChallenge(authChallenge: NSURLAuthenticationChallenge!,  completionHandler:(() -> (NSURLCredential?, NSError?)) {

    var cred = NSURLCredential(user: "myname", password: "mypass", persistence: NSURLCredentialPersistence.ForSession)
    return (cred, nil)
})

但是,它仍然在呕吐。有什么建议吗?

您的类型是向后的-您希望完成处理程序接受两个参数并不返回任何参数,但您已将其定义为不接受参数并返回一对参数的函数。把箭的两边弹下来

  • void函数是(Type1,Type2)->()
  • 您需要为方法本身添加->()
  • 您需要使用(cred,nil)调用completionHandler,而不是返回元组

    func provideUsernamePasswordForAuthChallenge(authChallenge: NSURLAuthenticationChallenge!,  completionHandler:(NSURLCredential?, NSError?)->()) ->() {
    
       var cred = 
          NSURLCredential(user: "myname", password: "mypass", 
             persistence: NSURLCredentialPersistence.ForSession)
       completionHandler(cred, nil)
    }
    
  • 此代码可能有帮助->

     AFAppDotNetAPIClient.sharedClient().GET("User", parameters:nil, success:{ (task : NSURLSessionDataTask!, JSON: AnyObject!) in
            // within block....
    
            }, failure:nil)
    

    您得到的错误是什么?这可以得到更进一步的清理:(1)方法本身不需要返回类型,因为它是无效的(因此您可以在方法签名中省略
    ->()
    ),以及(2)因为对于
    NSURLCredential
    而言,
    持久性
    参数的类型是已知的,您只需提供要使用的选项,
    .ForSession