Appel à fermeture rapide fermeture à l'intérieur - ios, swift

J'ai le code suivant:

  twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in


twitterAPI?.getUserTimelineWithScreenName(userName, count: 100, successBlock: { ([AnyObject]!) -> Void in



}, errorBlock: { (error :NSError!) -> Void in

})



}, errorBlock: { (error :NSError!) -> Void in

println("error block")
})

Je reçois les erreurs suivantes:

entrez la description de l'image ici

J'ai essayé de me dire à l'intérieur de la fermeture extérieure mais ça n'a pas marché. Qu'est-ce que je rate?

MISE À JOUR: Toujours avoir des erreurs de construction:

entrez la description de l'image ici

UPDATE: Si je mets la méthode getUserTimeline en dehors de la fermeture alors ça marche. CELUI-CI FONCTIONNE.

//        twitterAPI?.getUserTimelineWithScreenName("", successBlock: { (objects :[AnyObject]!) -> Void in
//
//            }, errorBlock: { (error: NSError!) -> Void in
//
//        })

Mais ceci NE

twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in


self.twitterAPI?.getUserTimelineWithScreenName("", successBlock: { (objects :[AnyObject]!) -> Void in

}, errorBlock: { (error: NSError!) -> Void in

})



}, errorBlock: { (error :NSError!) -> Void in


})

UPDATE: Définition de la méthode getUserTimeLine

self.twitterAPI?.getUserTimelineWithScreenName(<#screenName: String!#>, successBlock: <#(([AnyObject]!) -> Void)!##([AnyObject]!) -> Void#>, errorBlock: <#((NSError!) -> Void)!##(NSError!) -> Void#>)

entrez la description de l'image ici

UPDATE: Maintenant, j'obtiens une erreur de construction indiquant l'argument manquant depuisID. Je n'utilise même pas ce constructeur.

 if let twitterAPI = self.twitterAPI {

twitterAPI.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in

twitterAPI.getUserTimelineWithScreenName(userName, successBlock: { (objects :[AnyObject]!) -> Void in

}, errorBlock: { (error :NSError!) -> Void in

})


}, errorBlock: { (error :NSError!) -> Void in

})

}

Réponses:

4 pour la réponse № 1

Essayer:

        twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in
self.twitterAPI?.getUserTimelineWithScreenName(userName, successBlock: { (objects :[AnyObject]!) -> Void in

}, errorBlock: { (error :NSError!) -> Void in
})

return  // <-- ADDED

}, errorBlock: { (error :NSError!) -> Void in
})

Dans ce cas

{ (userName, password) -> Void in
self.twitterAPI?.getUserTimelineWithScreenName("", successBlock: { (objects :[AnyObject]!) -> Void in
}, errorBlock: { (error: NSError!) -> Void in
})
}

est une "fermeture d'expression unique" qui a implicitement non Void revenir.

À partir de Xcode 6.2 / Swift 1.1, vous avez besoin explicitement return ici.

Ou, utilisez Xcode 6.3 / Swift 1.2 qui a résolu ce problème.

Voir cette question: Fermeture à une ligne sans type de retour ou Swift - 'Bool' n'est pas un sous-type de 'Void'?


1 pour la réponse № 2

Ok, par les noms de méthodes que vous utilisez, je devine que vous utilisez le STTwitter bibliothèque. Si c'est le cas, vous voulez quelque chose comme ceci:

    if let twitterAPI = self.twitterAPI {
twitterAPI.verifyCredentialsWithSuccessBlock({ (String) -> Void in
twitterAPI.getUserTimelineWithScreenName("test", successBlock: { (objects: [AnyObject]!) -> Void in
println("success")
}, errorBlock: { (error: NSError!) -> Void in
println("failure")
})
}, errorBlock: { (error: NSError!) -> Void in

})
}

Notez l'appel let avant d'utiliser l'option self.twitterAPI variable.


1 pour la réponse № 3

version simple, par exemple. Mais mieux vaut faire monade

twitterAPI?.verifyCredentialsWithUserSuccessBlock({[weak self] (userName, password) in
self?.twitterAPI?.getUserTimelineWithScreenName(userName, count: 100, successBlock: {[weak self] (value: [AnyObject]!) in
// success
}) { (error: NSError!) in
// error
}
}) { (error: NSError!) in
// error
}

0 pour la réponse № 4

C'est un message d'erreur vraiment trompeur. Le problème est que la variable interne ne peut pas être de type facultatif, donc vous devez if/let il.

Regardez ça dans une aire de jeux ...

class Foo:NSObject {
func doThing(bug:Int,completion:((Void)->(Void))) {

}
}

let woot = Foo()
var bar:Foo? = Foo()

bar?.doThing(7, completion: {});

woot.doThing(3, completion: {

bar?.doThing(4, completion:{});

});

Il ne compile pas et le message

Impossible de convertir le type d'expression "(IntegerLiteralConvertible, achèvement: () -> () - $ T3) "pour taper" () "

N'est pas exactement éclairant au problème.

Donc, vous déballez l'option

woot.doThing(3, completion: {

if let bar = bar {
bar.doThing(4, completion:{});
}

});

Et il compile maintenant.

Et à l'autre question

Si vous vérifiez le STTwitterAPI.h entête

- (NSObject<STTwitterRequestProtocol> *)getUserTimelineWithScreenName:(NSString *)screenName
successBlock:(void(^)(NSArray *statuses))successBlock
errorBlock:(void(^)(NSError *error))errorBlock;

est juste une commodité pour la signature complète de ceci.

- (NSObject<STTwitterRequestProtocol> *)getUserTimelineWithScreenName:(NSString *)screenName
sinceID:(NSString *)sinceID
maxID:(NSString *)maxID
count:(NSUInteger)count
successBlock:(void(^)(NSArray *statuses))successBlock
errorBlock:(void(^)(NSError *error))errorBlock;

Obj-C à Swift pont place tout après le premier bloc sélecteur à l'intérieur des parenthèses afin que les méthodes de commodité ont tendance à confondre les choses par le code complétant mais ne fournissant pas le cas canonique.

Donc dans votre cas (sans moi ayant STTwitter) Voici ce que tu veux.

twitterAPI?.verifyCredentialsWithUserSuccessBlock({ (userName, password) -> Void in

if let twitterAPI = self.twitterAPI {
twitterAPI.getUserTimelineWithScreenName("JohnSmith",sinceID:someID,maxID:anotherID,count:1000, successBlock: { (objects)[AnyObject]!) -> Void in

}, errorBlock: { (error: NSError!) -> Void in

})
}


}, errorBlock: { (error :NSError!) -> Void in


})

comment vous choisissez de peupler sinceID , maxID et count C'est à toi de voir . Je n'ai jamais utilisé l'API ainsi gagné. Ils pourraient être nil "capable


Menu