2015-04-26 2 views
22

Это класс, распространяемый PFQueryTableViewController, и появляется следующая ошибка. Строки будут только PFUser.
Почему я не могу его бросить? Есть ли способ обойти это?Нельзя индексировать значение [AnyObject]? с индексом типа Int

Ошибка:

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

... для этой линии:

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

enter image description here

ответ

52

Проблема не литой, но тот факт, что self.objects, кажется, дополнительный массив: [AnyObject]?.
Поэтому, если вы хотите получить доступ к одному из его значений с помощью индекса, вы должны разворачивать массив первых:

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

self.objects?[indexPath.row] использует optional chaining сначала разворачивать self.objects, а затем вызвать его индекс.


Как Свифта 2, вы можете также использовать 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 
3

Мой обходной путь будет ..

  1. Если вы уверены, что таблица будет содержать только пользователи пытаются вывести объекты Array из AnyObject в Array из PFUser. затем используйте его.
+0

, который все еще дает ошибку, но это работает, не уверен, почему: 'var user2 = self.objects! [IndexPath.row] as! PFUser' – user1406716

+0

Поскольку объекты Array являются необязательными [AnyObject]? – Amit89

+0

да. Спасибо за помощь. – user1406716

5

Я столкнулся с той же проблемой и решить ее так:

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

В вашем случае, вы мог сделать:

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

Просто добавьте! (Восклицательный знак) после того, как объекты, например, так:

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

Это установило для меня :)

0

У меня была аналогичная проблема со следующей строкой:

array![row] 

Я не мог понять, где вопрос исходил; если я заменил row номером 1, код был скомпилирован и запущен без проблем.

Тогда я имел счастливую мысль изменить его к этому:

array![Int(row)] 

И это сработало. Для моей жизни я не понимаю, почему создание массива индекса -1 теоретически легально, но там вы идете. Для меня имеет смысл, чтобы индексы были неподписанными, но, возможно, это только я; Я должен попросить об этом Chris.