2015-01-27 13 views
25

Oto mój zwyczaj klasa ... nie wiem, czy czegoś mi brakuje w nim ...Jak prawidłowo określić macierz niestandardowych obiektów w Swift?

import UIKit 

class baseMakeUp { 
    var Image = UIImage() 
    var Brand: String 
    var Color: String 
    var Rating: Int = 0 

    init (Brand: String, Color: String) { 
     self.Brand = Brand 
     self.Color = Color 
    } 
} 

Próbuję instancję tutaj ...

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    let cellIdentifier = "cellIdentifier" 

    var foundation: [[baseMakeUp]] 
    var blush: [[baseMakeUp]] 
    var eyes: [[baseMakeUp]] 
    var lips: [[baseMakeUp]] 
    var nails: [[baseMakeUp]] 

    // put some test data in makeup arrays here... 
    foundation[0].Brand = "Revlon"  -------------> "Expected declaration" error. 
    foundation[0].Color = "Red" 
    foundation[0].Rating = 3 
    foundation[1].Brand = "MAC" 
    foundation[1].Color = "Blue" 
    foundation[1].Rating = 4 

Nie miałem” t obejmują resztę klasy ViewController, ponieważ nie sądziłem, że jest to konieczne.

Błąd występuje wtedy, gdy próbuję przypisać wartość fundamentu [0] .Brand

wdzięczni za pomoc z góry!

+0

Dziękuję wszystkim za pomoc. Aby to wyjaśnić, nie próbowałem używać tablic 2D, więc to naprawiłem. Jednak nawet po utworzeniu nowego obiektu typu BaseMakeUp, gdy próbuję go dołączyć, nadal pojawia się komunikat "oczekiwana deklaracja". Uważam, że błąd jest rzeczywiście z mojej deklaracji tablicy, ponieważ kiedy próbuję ponownie wpisać fundament, Xcode nie autouzupełniania lub zmienić kolor słowo jak zwykle. Nie jestem pewien, czego brakuje. – jbd36

Odpowiedz

0

Musisz instancję Twój obiekt klasy

przykład:

var foundation = baseMakeUp(Brand: "Some Brand", Color: "Red") 
6

masz kilka rzeczy dzieje się tutaj:

  1. Brakuje pewne konwencje nazewnictwa. Nazwy klas powinny być pisane wielką literą (baseMakeUp powinno być BaseMakeUp).
  2. Klasy klas powinny być małymi literami (image, brand, color, rating). Również w metodzie init jest color.
  3. Czy planujesz wielowątkową tablicę o numerze foundation? Jeśli chcesz po prostu regularny układ, pójdę z czymś takim:

    var foundation = [BaseMakeup]? 
    
  4. Jako druga odpowiedź mówi, trzeba także wystąpień obiektów BaseMakeup stosując metodę startowy:

    let aBaseMakeup = BaseMakeup(brand: "Revlon", color: "Red") 
    
  5. po tym, można dodać obiekty BaseMakeup do tablicy tak:

    foundation?.append(aBaseMakeup) 
    

Nadziei ly, rozumiem, co próbujesz osiągnąć.

37

Po pierwsze, zakładam, że nie chcesz tablic 2d. Jeśli tak, odpowiem na twoje pytanie z tej perspektywy poniżej.

var foundation = [baseMakeUp]() 

Tworzy pustą tablicę baseMakeUp nazywaną fundamentem. Nie możesz używać subskrybowania do dodawania elementów do tablicy, możesz go używać tylko do zmiany istniejących elementów. Ponieważ twoja tablica jest pusta, dodajesz elementy z dopiskiem.

foundation.append(baseMakeUp(Brand: "Brand", Color: "Color")) 

Ponieważ nie masz inicjalizatora baseMakeUp, który pozwala na przekazanie oceny, że ocena elementu wynosi 0.Jednak ponieważ dołączane go do tablicy można teraz używać go zmienić indeksowanie Ocena zmienną tak:

foundation[0].Rating = 3 

Jeśli nie zamierzają 2D tablic.

var foundation = [[baseMakeUp]]() 

Aby utworzyć tablicę

foundation.append([]) 
    foundation[0].append(baseMakeUp(Brand: "Brand", Color: "Color")) 
    foundation[0][0].Rating = 3 

Pierwsza linia dołącza pustą tablicę do macierzy najwyższego poziomu. Druga linia dołącza baseMakeUp do tablicy dodanej w pierwszym wierszu. Trzecia linia używa indeksowania, aby zmienić Rating pierwszego elementu w pierwszej tablicy twojej tablicy 2d.

Mamy nadzieję, że pomoże to w rozwiązaniu problemu.

Dodatkowo

miałem zamiar dodać punkty 1 i 2 z jday001s odpowiedzieć tutaj, ale należy sprawdzić ich odpowiedzi, jak również.

Edit

Właśnie uświadomiłem sobie, że próbujesz dodać elementy do swoich tablic w niewłaściwym zakresie.

Będziesz musiał przenieść

foundation.append(baseMakeUp(Brand: "Brand", Color: "Color") 

wewnątrz funkcji i nazwać siebie lub umieścić je w środku coś jakby viewDidLoad

np

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var foundation = [baseMakeUp]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     foundation.append(baseMakeUp(Brand: "Brand", Color: "Color") 
     foundation[0].Rating = 3 
    } 
} 

Mam nadzieję, że pomocne.

+0

Zaktualizowałem swoją odpowiedź. Mam nadzieję, że jestem wystarczająco jasny. – Nightly

+0

Tak, to było przez cały czas, byłem w złym zakresie próbując wielu rzeczy! Jeszcze raz dziękuję za pomoc, mam nadzieję ją przekazać dalej! – jbd36

+0

Ale kiedy potrzebuję teraz uzyskać dostęp do tablicy fundamentowej, wynik będzie podobny: - BaseMakeup (Marka: "Coś", kolor: "Coś"). Jak zrobić to jako prosty wynik, np. {Brand: "SOmething", kolor: "Coś"}? –

Powiązane problemy