Ответ 1
Просто укажите явно, что такое тип pictures
:
Итак, вместо:
let pictures = selectedRestaurant["Pictures"] as! NSArray
Запись:
let pictures: NSArray = selectedRestaurant["Pictures"] as! NSArray
Я новичок в кодировании и взял проект с открытым исходным кодом, чтобы получить эту идею. Надеюсь, вы, ребята, можете помочь мне исправить это.
let pictures = ( selectedRestaurant["Pictures"] as! NSArray ) //Here 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
}
}
}
}
Просто укажите явно, что такое тип pictures
:
Итак, вместо:
let pictures = selectedRestaurant["Pictures"] as! NSArray
Запись:
let pictures: NSArray = selectedRestaurant["Pictures"] as! NSArray
Для меня ответ заключался в том, чтобы конкретно указать тип массива, который я использовал для:
if let foo = dictionary["bar"] as? [String]
Это означает, что "Картинки" не являются допустимым индексом. Похоже, вы создаете константу с именем pictures
, и вы пытаетесь присвоить ей значение selectedRestaraunt["Pictures"]
, а затем пытаетесь использовать ее как NSArray
. Если selectedrestaraunt
уже является массивом, то то, что находится в скобках []
после selectedrestaraunt
, должно быть целочисленным значением, которое будет ссылаться на индекс в массиве selectedrestaraunt
. Obviosuly "Картинки" не является целым числом, это строка.
Если вы пытаетесь получить доступ к массиву в массиве. Значение pictures
- это массив, хранящийся в массиве selectedrestaraunt
, тогда вы можете получить к нему доступ, используя selectedRestaraunt[index of Pictures array]
, где [index of pictures array]
- целое число, которое равно номеру индекса, в котором массив Picutres
находится в пределах selectedrestaraunt
массив
Как упоминал Эрик и Юджин в своих комментариях, невозможно рассмотреть вопрос, который у вас есть, не зная тип selectedRestaurant
. В конце концов, почему вы получаете ошибку неоднозначности компилятора.
Я должен уважительно не соглашаться с MikeG. Проблема не в одном действительном индексе. Вы получили бы такую ошибку, если, например, у вас был тип selectedRestaurant
[NSNumber:AnyObject]
, где явно String больше не действует, поскольку ключ словаря может быть только NSNumber.
Мне удалось получить эту ошибку несколько странным образом. У меня был код вроде этого:
cell.textLabel = anArrayOfStrings[indexPath.item].uppercased()
И я был в тупике, почему он не мог понять, что это массив, хотя я очень четко заявлял его тип. Я сломал строку пополам и, наконец, получил полезное сообщение об ошибке:
let name = anArrayOfStrings[indexPath.item].uppercased()
cell.textLabel = name
Я пытался назначить String для UILabel, но почему-то точка, в которой был остановлен движок вывода типа, находилась в индексе.
Итак, мой совет любому, кто превзошел это, - попытаться разбить ваше выражение на куски размером с укусом, чтобы механизм вывода типа Swift мог легче усвоить.