我正在使用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 :))
我怀疑我在完成的处理程序的签名中有问题,但我无法弄清楚语法应该是什么。我错过了什么?
答案 0 :(得分:58)
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
参数。
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)