web-dev-qa-db-fra.com

Utilisation ambiguë de l'indice dans Swift

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)"
}
26
kriskendall99

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.

35
matt

["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)
}
7
emresancaktar

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!

2
Baylor Mitchell