2015-09-21 8 views
37

Mam następujący kod i jestem mylić o tym komunikat o błędzie:Co się dzieje tutaj: członek instancji nie może być stosowany na typ

członkiem Instance „MyDate” nie może być stosowany na typ „TableViewController”

Kod:

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) 
    ] 

Kiedy piszę co następuje, mogę go zbudować, ale nie wiem dlaczego fragment oder nie działa:

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

wpadłem na to samo. Twoją najczystszą opcją jest zdefiniowanie ich w klasie, ale zapełnienie ich w funkcji viewDidLoad(). Pozwoli ci to zagnieżdżać wszystko, co chcesz, bez tych denerwujących błędów kompilacji. –

+2

@ MarkLöwe, to "nie" najczystsze rozwiązanie ". I te błędy kompilatora są poprawne i zgodne z projektem języka. Najczystsze rozwiązanie to rozwiązanie tutaj napisane. Inicjowanie w 'viewDidLoad' może nie być możliwe nawet w klasach niezwiązanych z obiektem viewcontroller. Nie wprowadzajmy w błąd ludzi z niedorzecznymi komentarzami. – avismara

+0

wewnętrzny statyczny var mydate: NSDate; wewnętrzne statyczne elementy var; Jest to łatwy sposób, aby naprawić ten –

Odpowiedz

39

Problem polega na tym, że używasz self przed klasa jest w pełni zainicjowany. Możesz użyć gettera, który będzie wywoływany za każdym razem, gdy uzyskasz dostęp do zmiennej lub obliczasz ją leniwie.

Oto kod:

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) 
      ] 

     } 
    } 
} 

Lazy obliczeń:

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

Czy możesz dać mi przykład? – gurehbgui

+0

Proszę. To działa. – avismara

+0

Praca, dziękuję. – gurehbgui

-1

Kompilator jest zdezorientowany, ponieważ nie zna typu opcjonalnego NSDate. Możesz wyraźnie poinformować go o typie.

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) 
] 

Edit: W przypadku problemu z użyciem zmiennej instancji, można zainicjować swoje przedmioty z zamknięciem.

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

wciąż się błąd z tego naprawić – gurehbgui

3

Można użyć tego kodu

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) 
      ] 
     } 
    } 
Powiązane problemy