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

爷,独闯天下 提交于 2019-11-28 11:53:28
Marcus Rossel

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

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

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.

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

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

That fixed it for me :)

I had a similar issue with the following line:

array![row]

I could not understand where the issue came from; if I replaced row with a number like 1 the code compiled and ran without any issues.

Then I had the happy thought of changing it to this:

array![Int(row)]

And it worked. For the life of me, I don't understand why giving an array an index of -1is theoretically legal, but there you go. It makes sense to me for subscripts to be unsigned, but maybe it's just me; I'll have to ask Chris about it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!