J'effectue l'appel suivant en utilisant SDWebImage
sur mon imageView
, ce qui fonctionne bien avec Swift 2
mais donne une erreur avec XCode 8 beta 5
compilation avec Swift 3
:
imageView.sd_setImage(with:url, placeholderImage:placeholder, completed: {
(image: UIImage?, error: Error?, cacheType: SDImageCacheType, imageURL: URL?) in
...
});
L'erreur est:
Utilisation ambiguë de 'sd_setImage (avec: placeholderImage: complete :)'
Je soupçonne que j'ai une erreur dans la signature du gestionnaire terminé, mais je ne peux pas comprendre quelle devrait être la syntaxe. Qu'est-ce que je rate?
Le compilateur Swift traduit les en-têtes ObjC en Swift ce qui conduit à des collisions de noms:
o1) - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
o2) - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock;
Leur seule différence est le paramètre options
supplémentaire dans o2.
s1) open func sd_setImage(with url: URL!, placeholderImage placeholder: UIImage!, completed completedBlock: SDWebImage.SDWebImageCompletionBlock!)
s2) open func sd_setImage(with url: URL!, placeholderImage placeholder: UIImage!, options: SDWebImageOptions = [], completed completedBlock: SDWebImage.SDWebImageCompletionBlock!)
Parce que options
a été traduit en un paramètre facultatif (un tableau vide est affecté par défaut), l'appel de s1 dans Swift conduit à une utilisation ambiguë. L'appel s2 pourrait simplement avoir la même implémentation. En fournissant de telles méthodes dans le code Swift on ajouterait le paramètre options
comme optionnel dans une implémentation de fonction unique.
Comme solution de contournement, le paramètre options
pourrait être défini ou o1 ou o2 pourrait être renommé temporairement jusqu'à ce que SDWebImage soit traduit en Swift.
L'ajout de SDWebImageOptions
à l'appel de méthode résout le problème:
imageView.sd_setImage(with: someUrl,
placeholderImage: someImage,
options: [],
completed: someCompletitionBlock)