? ' no tiene un miembro llamado 'subíndice'

Estoy cargando una list de objects de una database de datos en una vista de tabla.

class ScheduleViewController: UITableViewController { private var items: [AnyObject]? // MARK: - Table view data source override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if let itemCount = items?.count { return itemCount } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("DayScheduleCell", forIndexPath: indexPath) as DayScheduleCell if let act = items[indexPath.row] as Activity { if act.client != nil { // ... } } return cell } } 

Los datos se recuperan dentro de un cierre, así que he declarado una matriz de items como opcional porque podría ser nula en la primera ejecución.

Estoy recibiendo el error '[AnyObject]?' no tiene un miembro llamado 'subíndice' en esta línea if let act = items[indexPath.row] as? Activity if let act = items[indexPath.row] as? Activity

No puedo entender cómo resolver esto.

La matriz se declara como:

  private var items: [AnyObject]? 

así que, como también dijiste, es opcional

En swift, una optional es una enumeración, por lo que un tipo por sí mismo, y como una opción, puede contener un valor nil o un object del tipo contenido.

Desea aplicar el subíndice a la matriz, no al opcional, por lo tanto, antes de usarlo, debe desenvolver la matriz de la opción opcional

 items?[indexPath.row] 

pero eso no es todo: también debes usar el downcast condicional:

 as? Activity 

porque la expresión anterior puede evaluar a cero

Entonces, la forma correcta de escribir la instrucción if es

 if let act = items?[indexPath.row] as? Activity { 

En primer lugar, debe desempaquetar u opcionalmente encadenar los elementos, ya que puede ser nil . AnyObject tiene un comportamiento diferente al get como elemento de matriz, debido a que AnyObject puede ser una function. Tendrías que lanzar desde artículos como este:

 if let act = items?[indexPath.row] as AnyObject? as Activity? { if act.client != nil { // ... } } 

Si los items nunca contendrán una function que puedes usar

 private var items: [Any]? 

en su lugar y con:

 if let act = items?[indexPath.row] as? Activity { if act.client != nil { // ... } } 

He solucionado mi problema al convertir el tipo de var de índice de UInt a Int

 let obj = items[Int(index)] 

Espero que esto pueda ayudar a alguien que todavía tiene este problema.