web-dev-qa-db-ja.com

'sd_setImage(with:placeholderImage:completed :)'とSwift 3のあいまいな使用

私はSDWebImageimageViewを使用して次の呼び出しを行っています。これはSwift 2で正常に動作しますが、XCode 8 beta 5でコンパイルするとSwift 3でエラーが発生します。

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

エラーは次のとおりです。

「sd_setImage(with:placeholderImage:completed :)」のあいまいな使用

完了したハンドラーの署名に何か問題があると思われますが、構文がどうあるべきかわかりません。私は何が欠けていますか?

28
carloshwa

Swift=コンパイラは、ObjCヘッダーをSwiftに変換します。これにより、名前の衝突が発生します。

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;

唯一の違いは、o2の追加のoptionsparameterです。

生成された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!)

optionsがオプションのパラメーター(デフォルトでは空の配列に割り当てられている)に変換されたため、Swift)でs1を呼び出すと曖昧な使用につながる。s2を呼び出すと、単純に同じ実装を使用できます。Swift= codeでそのようなメソッドを提供する場合、optionsパラメータを単一機能の実装ではオプションです。

Workaround

回避策として、optionsパラメーターを設定するか、o1またはo2をSDWebImageが一時的に変更されるまで一時的に名前変更できます。 Swiftに翻訳されました。

58
M_G

SDWebImageOptionsをメソッド呼び出しに追加すると、問題が修正されます。

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