web-dev-qa-db-fra.com

Utilisation ambiguë de 'sd_setImage (avec: placeholderImage: complete :)' avec Swift 3

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?

28
carloshwa

Le compilateur Swift traduit les en-têtes ObjC en Swift ce qui conduit à des collisions de noms:

UIImageView + WebCache.h:

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.

Généré Swift:

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.

Workaround

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.

58
M_G

L'ajout de SDWebImageOptions à l'appel de méthode résout le problème:

imageView.sd_setImage(with: someUrl,
          placeholderImage: someImage,
                   options: [], 
                 completed: someCompletitionBlock)
19
budidino