Подтвердить что ты не робот

Неоднозначное использование 'sd_setImage (с: placeholderImage: completed:)' с Swift 3

Я делаю следующий вызов, используя 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 (с: placeholderImage: completed:)'

Я подозреваю, что у меня что-то не так в сигнатуре для обработчика, но я не могу понять, какой синтаксис должен быть. Что мне не хватает?

4b9b3361

Ответ 1

Компилятор 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;

Единственное их отличие - дополнительный параметр options в o2.

Сгенерированное объявление 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 был переведен в необязательный параметр (по умолчанию задан пустой массив), вызывающий s1 в Swift приводит к двусмысленному использованию. Вызов s2 может просто иметь ту же реализацию. При предоставлении таких методов в коде Swift можно добавить параметр options как необязательный в реализацию одной функции.

Обход

В качестве обходного пути можно установить параметр options или o1 или o2 можно временно переименовать, пока SDWebImage не будет переведен в Swift.

Ответ 2

Добавление SDWebImageOptions к вызову метода устраняет проблему:

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