2015-09-21 20 views
37

Ho il seguente codice e sono confuso su questo messaggio di errore:Cosa c'è che non va qui: membro di istanza non può essere utilizzato su tipo

membro di istanza 'mydate' non può essere utilizzato su tipo 'TableViewController'

Codice:

class TableViewController: UITableViewController {  
    let mydate = NSDate() 
    let items = [ 
     (1, 9, 7, "A", mydate), 
     (2, 9, 7, "B", mydate), 
     (3, 9, 7, "C", mydate), 
     (4, 9, 7, "D", mydate) 
    ] 

Quando scrivo quanto segue, posso costruire, ma non so il motivo per cui il frammento di oder non funziona:

class TableViewController: UITableViewController {  
    let mydate = NSDate() 
    let items = [ 
     (1, 9, 7, "A", nil), 
     (2, 9, 7, "B", mydate), 
     (3, 9, 7, "C", mydate), 
     (4, 9, 7, "D", mydate) 
    ] 
+0

ho incontrato la stessa cosa. La tua opzione più pulita è definirli nella classe, ma inserirli nella funzione viewDidLoad(). Questo ti permetterà di nidificare tutto ciò che desideri senza questi fastidiosi errori di compilazione. –

+2

@ MarkLöwe, che "non" è la soluzione più pulita ". E questi errori del compilatore sono validi e coerenti con il design della lingua. La soluzione più pulita è la soluzione scritta qui. Inizializzare in 'viewDidLoad' potrebbe non essere nemmeno possibile in classi basate su non viewcontroller. Non inganniamo le persone con commenti ridicoli. – avismara

+0

interno statico var mydate: NSDate; articoli statici interni; Questo è il modo semplice per risolvere questo –

risposta

39

Il problema qui è che si sta utilizzando self prima della classe è completamente inizializzato. È possibile avere un getter che verrà chiamato ogni volta che si accede alla variabile o calcolata pigramente.

Ecco il codice:

class TableViewController: UITableViewController { 
    let mydate = NSDate() 
    var items : [(Int,Int,Int,String,NSDate)] { 
     get { 
      return [ 
       (1, 9, 7, "A", mydate), 
       (2, 9, 7, "B", mydate), 
       (3, 9, 7, "C", mydate), 
       (4, 9, 7, "D", mydate) 
      ] 

     } 
    } 
} 

pigro calcolo:

class TableViewController: UITableViewController { 
    let mydate = NSDate() 
    lazy var items : [(Int,Int,Int,String,NSDate)] = { 

      return [ 
       (1, 9, 7, "A", self.mydate), 
       (2, 9, 7, "B", self.mydate), 
       (3, 9, 7, "C", self.mydate), 
       (4, 9, 7, "D", self.mydate) 
      ] 


    }() 
} 
+0

Puoi farmi un esempio? – gurehbgui

+0

Ecco qua. Questo funziona. – avismara

+0

Funzionando, grazie. – gurehbgui

-1

Il compilatore viene confuso perché non conosce il tipo di NSDate opzionale. Puoi far sapere in modo esplicito il tipo.

let items : Array<(Int, Int, Int, String, NSDate?)> = [ 
    (1, 9, 7, "A", nil), 
    (2, 9, 7, "B", mydate), 
    (3, 9, 7, "C", mydate), 
    (4, 9, 7, "D", mydate) 
] 

Modifica: per il problema con l'utilizzo della variabile di istanza, è possibile inizializzare gli elementi con una chiusura.

let items : Array<(Int, Int, Int, String, NSDate?)> = { 
    let mydate = NSDate() 
    return [ 
     (1, 9, 7, "A", nil), 
     (2, 9, 7, "B", mydate), 
     (3, 9, 7, "C", mydate), 
     (4, 9, 7, "D", mydate) 
    ] 
    }() 
+0

Ancora ricevendo l'errore con questa correzione – gurehbgui

3

È possibile utilizzare questo codice

var items:Array<(Int, Int, Int, String, NSDate)> { 
     get { 
      return [ 
       (1, 9, 7, "A", mydate), 
       (2, 9, 7, "B", mydate), 
       (3, 9, 7, "C", mydate), 
       (4, 9, 7, "D", mydate) 
      ] 
     } 
    } 
Problemi correlati