Je reçois toujours une erreur "d'utilisation ambiguë de l'indice" dans mon code Swift. Je ne sais pas ce qui cause cette erreur. Elle est apparue de manière aléatoire. Voici mon code:
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)"
}
Le problème est que vous utilisez NSArray:
myQuestionsArray = NSArray(contentsOfFile: path)
Cela signifie que myQuestionArray
est un NSArray. Mais un NSArray n'a aucune information de type sur ses éléments. Ainsi, lorsque vous arrivez à cette ligne:
let currentQuestionDict = myQuestionsArray!.objectAtIndex(count)
... Swift n'a pas d'informations de type et doit faire de currentQuestionDict
un AnyObject. Mais vous ne pouvez pas souscrire un AnyObject, donc des expressions comme currentQuestionDict["choice1"]
ne peut pas compiler.
La solution consiste à utiliser Swift types. Si vous savez ce qu'est vraiment currentQuestionDict
, tapez-le comme ce type. À tout le moins, car vous semblez croire que c'est un dictionnaire , faites-en un, tapez-le comme [NSObject:AnyObject]
(et plus précis si possible). Tu peux le faire de plusieurs façons; une façon consiste à transtyper lorsque vous créez la variable:
let currentQuestionDict =
myQuestionsArray!.objectAtIndex(count) as! [NSObject:AnyObject]
En bref, n'utilisez jamais NSArray et NSDictionary si vous pouvez l'éviter (et vous pouvez généralement l'éviter). Si vous en recevez un d'Objective-C, saisissez-le tel qu'il est réellement, afin que Swift puisse fonctionner avec.
["Key"] a provoqué cette erreur. Nouveau Swift update, vous devez utiliser objectForKey
pour obtenir votre valeur. Dans votre cas, changez simplement votre code en;
if let button1Title = currentQuestionDict.objectForKey("choice1") as? String {
button1.setTitle("\(button1Title)", forState: UIControlState.Normal)
}
Voici le code que j'ai utilisé pour résoudre l'erreur:
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
J'espère que cela t'aides!