Estoy haciendo la siguiente llamada utilizando SDWebImage en mi imageView, que funciona bien con Swift 2 pero da un error con XCode 8 beta 5 compilar con Swift 3:

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

El error es:

Uso ambiguo de ‘sd_setImage(con:placeholderImage:terminado:)’

Sospecho que tengo algo mal en la firma para el controlador completo, pero no puedo averiguar lo que la sintaxis debe ser. Lo que me estoy perdiendo?

InformationsquelleAutor carloshwa | 2016-08-15

2 Comentarios

  1. 58

    El Swift compilador traduce el ObjC cabeceras de Swift que conduce a colisiones entre nombres:

    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;

    Su única diferencia es el adicional optionsparámetro en o2.

    Generado Swift declaración:

    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!)

    Porque options se tradujo en un parámetro opcional (por defecto asigna una matriz vacía), llamando a s1 en Swift lleva a un uso ambiguo. Llamar s2 podría simplemente tener la misma aplicación.
    Cuando la prestación de tales métodos en el código Swift uno podría agregar el options parámetro opcional en una sola implementación de la función.

    Solución

    Como solución la options parámetro se puede establecer o o1 o o2 podría llamarse temporalmente hasta que SDWebImage será traducido en Swift.

    • Buen lugar. Gracias. Además aquí es el derecho de retención, que corrige temporal de la colisión tema: yourImageView.sd_setImage(con: tu url, placeholderImage: yourPlaceholderImage, opciones: SDWebImageOptions(), que se completó: yourImageTransitionCompletitionBlock)
  2. 19

    La adición de SDWebImageOptions a la llamada al método corrige el problema:

    imageView.sd_setImage(with: someUrl,
              placeholderImage: someImage,
                       options: [], 
                     completed: someCompletitionBlock)
    • Yo estaba usando Swift dentro de objective-c proyecto. Cambiar el nombre de las cosas, no era una opción como el anterior código Objective-C también estaba usando esos métodos. Su solución es perfecta para mi tipo de escenario

Dejar respuesta

Please enter your comment!
Please enter your name here