使用Swift 3模糊地使用'sd_setImage(with:placeholderImage:completed :)'

时间:2016-08-15 04:10:01

标签: ios sdwebimage swift3 xcode8

我正在使用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 :))

我怀疑我在完成的处理程序的签名中有问题,但我无法弄清楚语法应该是什么。我错过了什么?

2 个答案:

答案 0 :(得分:58)

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 中的额外options参数。

生成的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代码中提供这样的方法时,可以在单个函数实现中将options参数添加为可选。

解决方法

作为一种解决方法,可以设置options参数,或者可以暂时重命名 o1 o2 ,直到将SDWebImage转换为Swift。

答案 1 :(得分:18)

在方法调用中添加SDWebImageOptions可以解决问题:

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