Swift 3中'sd_setImage(with:placeholderImage:completed :)'的含义不明确

28

我正在使用在我的imageView上使用SDWebImage进行以下调用,它在Swift 2中可以正常工作,但是在使用XCode 8 beta 5Swift 3编译时出现错误:

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

错误为:

'sd_setImage(with:placeholderImage:completed:)' 的使用不明确

我怀疑 completed handler 的签名有问题,但是我无法弄清该语法应该是什么。我缺少什么?

2个回答

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 参数设置为o1o2,或者暂时重命名直到SDWebImage被翻译为Swift。


11
好的,谢谢您。此外,以下是修复碰撞问题的链接:yourImageView.sd_setImage(with: yourUrl, placeholderImage: yourPlaceholderImage, options: SDWebImageOptions(), completed: yourImageTransitionCompletitionBlock)。 - dzensik

19

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

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

1
我在 Objective-C 项目中使用 Swift。重命名是不可能的,因为之前的 Objective-C 代码也在使用这些方法。你的解决方案非常适合我的情况。 - Rohan Sanap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接