arrays - remove - Uso ambiguo de subíndices en Swift
swift filter array (3)
Sigo recibiendo un error de "uso ambiguo de subíndices" en mi código Swift. No sé qué está causando este error. Simplemente apareció de forma aleatoria. Aquí está mi código:
if let path = NSBundle.mainBundle().pathForResource("MusicQuestions", ofType: "plist") {
myQuestionsArray = NSArray(contentsOfFile: path)
}
var count:Int = 1
let currentQuestionDict = myQuestionsArray!.objectAtIndex(count)
if let button1Title = currentQuestionDict["choice1"] as? String {
button1.setTitle("/(button1Title)", forState: UIControlState.Normal)
}
if let button2Title = currentQuestionDict["choice2"] as? String {
button2.setTitle("/(button2Title)", forState: UIControlState.Normal)
}
if let button3Title = currentQuestionDict["choice3"] as? String {
button3.setTitle("/(button3Title)", forState: UIControlState.Normal)
}
if let button4Title = currentQuestionDict["choice4"] as? String {
button4.setTitle("/(button4Title)", forState: UIControlState.Normal)
}
if let question = currentQuestionDict["question"] as? String!{
questionLabel.text = "/(question)"
}
El problema es que estás usando NSArray:
myQuestionsArray = NSArray(contentsOfFile: path)
Esto significa que myQuestionArray
es un NSArray. Pero un NSArray no tiene información de tipo sobre sus elementos. Así, cuando llegas a esta línea:
let currentQuestionDict = myQuestionsArray!.objectAtIndex(count)
... Swift no tiene información de tipo, y tiene que hacer currentQuestionDict
un AnyObject. Pero no puede subíndicar un AnyObject, por lo que expresiones como currentQuestionDict["choice1"]
no se pueden compilar.
La solución es usar los tipos Swift. Si sabe qué es en realidad currentQuestionDict
, currentQuestionDict
como ese tipo. Como mínimo, ya que parece creer que es un diccionario, conviértalo en uno; [NSObject:AnyObject]
como [NSObject:AnyObject]
(y más específico si es posible). Puedes hacer esto de varias maneras; una forma es lanzando cuando creas la variable:
let currentQuestionDict =
myQuestionsArray!.objectAtIndex(count) as! [NSObject:AnyObject]
En resumen, nunca use NSArray y NSDictionary si puede evitarlo (y generalmente puede evitarlo). Si recibe uno de Objective-C, escríbalo como realmente es, para que Swift pueda trabajar con él.
Este es el código que utilicé para resolver el error:
let cell:AddFriendTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! AddFriendTableViewCell
let itemSelection = items[indexPath.section] as! [AnyObject] //''items'' is an array of NSMutableArrays, one array for each section
cell.label.text = itemSelection[indexPath.row] as? String
¡Espero que esto ayude!
["Clave"] ha causado este error. Nueva actualización de Swift, debe usar objectForKey
para obtener su valor. En su caso, simplemente cambie el código a;
if let button1Title = currentQuestionDict.objectForKey("choice1") as? String {
button1.setTitle("/(button1Title)", forState: UIControlState.Normal)
}