我是编码新手,拿起了一些开源项目来获得这个想法。
我收到错误:
对成员"下标"的模糊引用
在下面的代码中:
let pictures = ( selectedRestaurant["Pictures"] as! NSArray ) // 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
数组中的索引。显然,"图片"不是一个整数,而是一个字符串。
如果您尝试访问数组中的数组。这意味着Pictures
是存储在selectedRestaraunt
数组中的数组,然后您可以使用selectedRestaraunt[index of Pictures array]
访问它,其中[index of pictures array]
是一个整数,等于Picutres
数组驻留在selectedRestaraunt
数组中的索引号
我设法以一种有点奇怪的方式得到了这个错误。我有这样的代码:
cell.textLabel = anArrayOfStrings[indexPath.item].uppercased()
我很困惑为什么它无法弄清楚这是一个数组,尽管我非常清楚地声明了它的类型。我将行一分为二,最后收到一条有用的错误消息:
let name = anArrayOfStrings[indexPath.item].uppercased()
cell.textLabel = name
我试图将字符串分配给 UILabel,但不知何故,类型推理引擎失败的点是在下标处。
因此,我对任何对此感到困惑的人的建议是尝试将您的陈述分解成一口大小的块,以便 Swift 类型推理引擎更容易消化。
正如埃里克和尤金在他们的评论中提到的那样,在不知道selectedRestaurant
类型的情况下,不可能审查您遇到的问题。毕竟,这就是您遇到编译器歧义错误的原因。
不过,我必须恭敬地不同意迈克的观点。问题不在于有效的下标。例如,如果您有一个selectedRestaurant
类型的[NSNumber:AnyObject]
,则会遇到这种错误,其中显然字符串不再有效,因为字典键只能是 NSNumber。