unwrap - SWIFT ERROR Referencia ambigua al miembro ''subíndice''
unwrap optional swift 4 (5)
Como Eric y Eugene mencionaron en sus comentarios, es imposible revisar el problema que está teniendo sin saber el tipo de restaurante selectedRestaurant
. Después de todo, es por eso que está recibiendo el error de ambigüedad del compilador.
Sin embargo, tengo que discrepar respetuosamente con MikeG. El problema no es uno de un subíndice válido. [NSNumber:AnyObject]
ese tipo de error si, por ejemplo, tuviera un tipo de [NSNumber:AnyObject]
selectedRestaurant
de [NSNumber:AnyObject]
, donde claramente String ya no es válido ya que la clave del diccionario solo podría ser un NSNumber.
Soy nuevo en la codificación y elegí un proyecto de código abierto para obtener la idea. Espero que ustedes puedan ayudarme a arreglar eso
let pictures = ( selectedRestaurant["Pictures"] as! NSArray ) //Here''s where i get the error
let picture = ( pictures[zoomedPhotoIndex] as! NSDictionary )
let pictureURL = picture["url"] as! String
let imageURL = NSURL(string: pictureURL)
let urlRequest = NSURLRequest(URL: imageURL!)
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) {
response, data, error in
if error == nil && data != nil {
self.imageView.image = UIImage(data: data!)
self.imageView.contentMode = UIViewContentMode.ScaleAspectFit
}
}
}
}
Me las arreglé para obtener este error de una manera algo extraña. Tuve un código como este:
cell.textLabel = anArrayOfStrings[indexPath.item].uppercased()
Y me quedé perplejo en cuanto a por qué no podía darse cuenta de que se trataba de una matriz, a pesar de que muy claramente declaré su tipo. Rompí la línea en dos y finalmente recibí un mensaje de error útil:
let name = anArrayOfStrings[indexPath.item].uppercased()
cell.textLabel = name
Estaba tratando de asignar una cadena a una UILabel, pero de alguna manera el punto en el que falló el motor de inferencia de tipo estaba en el subíndice.
Por lo tanto, mi consejo para cualquiera que se haya quedado perplejo es que intente dividir su declaración en trozos pequeños que el motor de inferencia de tipo Swift puede digerir más fácilmente.
Para mí, la respuesta fue establecer específicamente el tipo de arreglo al que estaba emitiendo:
if let foo = dictionary["bar"] as? [String]
Significa que "Imágenes" no es un subíndice válido. Parece que está creando una imagen con nombre constante y está tratando de asignarle un valor de selectedRestaraunt["Pictures"]
y luego trata de convertirlo en un NSArray
. Si selectedrestaraunt
ya es una matriz, entonces lo que va entre los corchetes []
después de selectedRestaraunt
debe ser un valor entero que se refiera a un índice en la matriz selectedRestaraunt
. Obviosuly "Pictures" no es un entero, es una cadena.
Si está intentando acceder a una matriz dentro de una matriz. Lo que significa que Pictures
es una matriz almacenada dentro de la matriz de Reestaraunt selectedRestaraunt
luego puede acceder a ella utilizando la Picutres
matriz [index of pictures array]
selectedRestaraunt[index of Pictures array]
donde [index of pictures array]
es un número entero que es igual al número de índice en el que reside la matriz de Picutres
array selectedRestaraunt
Simplemente especifique explícitamente cuál es el tipo de pictures
:
Así que en lugar de:
let pictures = selectedRestaurant["Pictures"] as! NSArray
Escribir:
let pictures: NSArray = selectedRestaurant["Pictures"] as! NSArray