Syntaxe Swift pour bloc avec completionHandler... dans la méthode delegate

il s'agit d'une ride sur le problème du bloc d'achèvement nslsession régulier, que j'ai du mal à résoudre dans la syntaxe Swift. La méthode est le callback d'authentification delegate, qui est invoqué sur auth challenge; le développeur appelle le bloc completion avec NSURLCredential, NSError.

la méthode Objective-C ressemble à ceci:

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

    NSURLCredential* credential = [NSURLCredential credentialWithUser:@"myname" 
                                                             password:@"mypass" 
                                                          persistence:NSURLCredentialPersistenceForSession];
    completionHandler(credential, nil);
}

le plus proche que je pense avoir obtenu dans Swift, est celui-ci:

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

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

Mais, c'est encore barfing. Tout recommandations?

8
demandé sur Stan 2014-06-19 05:29:13

3 réponses

  1. une fonction de vide est (Type1, Type2) ->()
  2. vous devez ajouter l'option ->() pour la méthode elle-même
  3. Vous devez appeler completionHandler avec (cred, nil), pas de retour d'un n-uplet

    func provideUsernamePasswordForAuthChallenge(authChallenge: NSURLAuthenticationChallenge!,  completionHandler:(NSURLCredential?, NSError?)->()) ->() {
    
       var cred = 
          NSURLCredential(user: "myname", password: "mypass", 
             persistence: NSURLCredentialPersistence.ForSession)
       completionHandler(cred, nil)
    }
    
15
répondu Lou Franco 2014-06-19 01:41:11

Ce code peut vous aider ->

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

        }, failure:nil)
1
répondu Prakash Raj 2014-09-30 06:12:46

votre type est à l'envers-vous voulez que le gestionnaire d'achèvement prenne deux arguments et n'en renvoie aucun, mais vous l'avez défini comme une fonction qui ne prend aucun argument et renvoie une paire. Flop les deux côtés de la flèche.

0
répondu Chuck 2014-06-19 01:40:24