私はSDWebImage
でimageView
を使用して次の呼び出しを行っています。これは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 :)」のあいまいな使用
完了したハンドラーの署名に何か問題があると思われますが、構文がどうあるべきかわかりません。私は何が欠けていますか?
Swift=コンパイラは、ObjCヘッダーをSwiftに変換します。これにより、名前の衝突が発生します。
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の追加のoptions
parameterです。
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
パラメータを単一機能の実装ではオプションです。
回避策として、options
パラメーターを設定するか、o1またはo2をSDWebImageが一時的に変更されるまで一時的に名前変更できます。 Swiftに翻訳されました。
SDWebImageOptions
をメソッド呼び出しに追加すると、問題が修正されます。
imageView.sd_setImage(with: someUrl,
placeholderImage: someImage,
options: [],
completed: someCompletitionBlock)