2014-09-22 3 views
7

Sto caricando un elenco di oggetti da un database di dati di base in una vista tabella.[AnyObject]? ' non ha un membro chiamato 'subscript'

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 
    } 
} 

I dati vengono recuperati all'interno di una chiusura così ho dichiarato items array come optional perché potrebbe essere trascurabile della prima esecuzione.

Viene visualizzato l'errore '[AnyObject]?' non ha un membro chiamato 'subscript' su questa riga if let act = items[indexPath.row] as? Activity.

Non riesco a capire come risolvere questo problema.

risposta

21

L'array è dichiarato come:

private var items: [AnyObject]? 

così, come anche lei ha detto, è un optional

a Swift un optional è un enum, quindi un tipo da solo - e come optional , può contenere un valore nil o un oggetto del tipo contenuto.

si desidera applicare l'indice alla matrice, non al opzionale, quindi prima di utilizzarlo bisogna scartare l'array dal opzionale

items?[indexPath.row] 

ma non è tutto - si hanno anche per utilizzare il avvilito condizionale:

as? Activity 

perché l'espressione precedente può valutare a zero

Quindi il modo corretto di scrivere l'istruzione if è

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

Grazie per la risposta. Ricevo un nuovo errore ** Impossibile richiamare '! =' Con un elenco di argomenti di tipo '(@lvalue Client, NilLiteralConvertible)' ** sulla riga 'if act.client! = Nil'. La proprietà client è una proprietà che contiene un oggetto 'Client'. Si prega di consultare la sottoclasse 'NSManagedObject' (http://pastie.org/9584414#) di' Activity'. Nel modello di dati ispezionare sotto le proprietà per il cliente, tuttavia è selezionato come facoltativo. – Isuru

+0

'client' non è un optional, e come tale non può essere' nil' - quindi non è possibile verificare se non è nullo.Che 'if' è concettualmente ridondante e ovviamente considerato un errore per il compilatore – Antonio

+0

Quindi in base a [questo] (http://stackoverflow.com/q/25485273/1077789) domanda, anche se le proprietà sono contrassegnate come facoltative in Dati principali, non è menzionato nelle classi 'NSManagedObject' generate. Devi aggiungerlo manualmente. Ho aggiunto un '?' Di fronte alla proprietà del client e ora funziona correttamente. – Isuru

2

Prima di tutto è necessario scartare o mettere in sequenza gli articoli come può essere nil. AnyObject ha un comportamento diverso quando si ottiene come elemento dalla matrice, poiché il AnyObject può essere una funzione. Si dovrà lanciare da articoli come questo:

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

Se items non potrà mai contenere una funzione è possibile utilizzare

private var items: [Any]? 

invece e cast con:

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

Grazie per la risposta. Ma sfortunatamente continuo a ricevere lo stesso errore sulla stessa riga. – Isuru

+0

Scusa, ho avuto un errore di battitura. Prova ora. – Kirsteins

+0

Questo errore è scomparso. Ma ottengo un nuovo errore ** Impossibile richiamare '! =' Con un elenco di argomenti di tipo '(@lvalue Client, NilLiteralConvertible)' ** sulla riga 'if act.client! = Nil' – Isuru

1

ho fissato il mio problema per convertire il tipo di indice var da UInt a Int

let obj = items[Int(index)] 

Spero che questo possa aiutare qualcuno che ha ancora questo problema.

Problemi correlati