web-dev-qa-db-fra.com

Impossible d'indexer une valeur de [AnyObject]? avec un index de type Int

C'est dans une classe étendant PFQueryTableViewController et j'obtiens l'erreur suivante. Les lignes seront uniquement PFUser.
Pourquoi ne puis-je pas le lancer? Y a-t-il un moyen de contourner ceci?

L'erreur est:

Cannot subscript a value of [AnyObject]? with an index of type Int

... pour cette ligne:

var user2 = self.objects[indexPath.row] as! PFUser

enter image description here

25
user1406716

Le problème n'est pas le casting, mais le fait que self.objects semble être un tableau facultatif: [AnyObject]?.
Par conséquent, si vous souhaitez accéder à l'une de ses valeurs via un indice, vous devez d'abord déballer le tableau:

var user2: PFUser
if let userObject = self.objects?[indexPath.row] {
    user2 = userObject as! PFUser
} else {
    // Handle the case of `self.objects` being `nil`.
}

L'expression self.objects?[indexPath.row] utilise chaînage facultatif pour déballer d'abord self.objects, puis appelez son indice.


À partir de Swift 2, vous pouvez également utiliser la instruction guard :

var user2: PFUser
guard let userObject = self.objects?[indexPath.row] else {
    // Handle the case of `self.objects` being `nil` and exit the current scope.
}
user2 = userObject as! PFUser
61
Marcus Rossel

J'ai rencontré le même problème et l'ai résolu comme ceci:

let scope : String = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] as! String

Pour votre cas, vous pourriez faire:

var user2 : PFUser = self.objects![indexPath.row] as! PFUser
6
rudenudedude

Ma solution de contournement serait ..

  1. Si vous êtes certain que la vue de table ne contiendra que des utilisateurs, essayez de transtyper les objets Tableau de AnyObject en Tableau de PFUser. puis utilisez-le.
3
Amit89

Ajoutez simplement un! (point d'exclamation) après les objets, comme ceci:

var user2 = self.objects![indexPath.row] as! PFUser

Cela m'a corrigé :)

1
ojassethi

J'ai eu un problème similaire avec la ligne suivante:

array![row]

Je ne pouvais pas comprendre d'où venait le problème; si j'ai remplacé row par un nombre comme 1 le code compilé et exécuté sans aucun problème.

Ensuite, j'ai eu la pensée heureuse de le changer en ceci:

array![Int(row)]

Et ça a marché. Pour ma vie, je ne comprends pas pourquoi donner à un tableau un indice de -1est théoriquement légal, mais voilà. Il est logique pour moi que les indices ne soient pas signés, mais c'est peut-être juste moi; Je vais devoir demander Chris à ce sujet.

0
dinesharjani