webentwicklung-frage-antwort-db.com.de

Mehrdeutige Verwendung von 'sd_setImage (with: placeholderImage: completed :)' mit Swift 3

Ich rufe den folgenden Befehl mit SDWebImage auf meinem imageView auf, was mit Swift 2 Gut funktioniert, aber mit XCode 8 beta 5 Einen Fehler beim Kompilieren mit Swift 3:

 imageView.sd_setImage(with:url, placeholderImage:placeholder, completed: {
    (image: UIImage?, error: Error?, cacheType: SDImageCacheType, imageURL: URL?) in
            ...
    });

Der Fehler ist:

Mehrdeutige Verwendung von 'sd_setImage (with: placeholderImage: completed :)'

Ich vermute, dass die Signatur des fertiggestellten Handlers nicht stimmt, aber ich kann nicht herausfinden, wie die Syntax lauten soll. Was vermisse ich?

28
carloshwa

Der Compiler Swift übersetzt die ObjC-Header in Swift, was zu Namenskollisionen führt:

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;

Ihr einziger Unterschied ist der zusätzliche optionsParameter in o2.

Generierte Swift Deklaration:

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!)

Da options in einen optionalen Parameter übersetzt wurde (standardmäßig wurde ein leeres Array zugewiesen), führt der Aufruf von s1 in Swift zu einer mehrdeutigen Verwendung. Aufruf von s2 könnte einfach dieselbe Implementierung haben. Wenn solche Methoden in Swift code bereitgestellt werden, würde man den Parameter options als optional in einer Implementierung mit einer einzelnen Funktion hinzufügen.

Workaround

Als Problemumgehung kann der Parameter options gesetzt oder o1 oder o2 vorübergehend umbenannt werden, bis SDWebImage in Swift übersetzt wird.

58
M_G

Das Hinzufügen von SDWebImageOptions zum Methodenaufruf behebt das Problem:

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