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

51,824

Solution 1

The problem isn't the cast, but the fact that self.objects seems to be an optional array: [AnyObject]?.
Therefore, if you want to access one of its values via a subscript, you have to unwrap the array first:

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

The expression self.objects?[indexPath.row] uses optional chaining to first unwrap self.objects, and then call its subscript.


As of Swift 2, you could also use the guard statement:

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

Solution 2

I ran into the same issue and resolved it like this:

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

For your case, you might do:

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

Solution 3

My workaround would be..

  1. If you are certain that the tableview will contain only users try to typecast the objects Array of AnyObject to Array of PFUser. then use it.

Solution 4

Just add an ! (exclamation mark) after objects, like so:

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

That fixed it for me :)

Share:
51,824

Related videos on Youtube

user1406716
Author by

user1406716

Updated on May 07, 2020

Comments

  • user1406716
    user1406716 about 4 years

    This is in a class extending PFQueryTableViewController and I am getting the following error. The rows will be PFUser only.
    Why am I not able to cast it? Is there a way around this?

    The error is:

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

    ...for this line:

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

    enter image description here

  • user1406716
    user1406716 about 9 years
    that still gives error, but this works, not sure why: var user2 = self.objects![indexPath.row] as! PFUser
  • Amit89
    Amit89 about 9 years
    Because objects Array is optional [AnyObject]?