2017-07-18 3 views
0

ich lerne schnell atm und die Verwendung von Klassen hielt mich die letzten zwei Wochen beschäftigt.Probleme mit Werten von Klasse

danke für jede Hilfe

für ein Projekt in Xcode i eine schnelle Datei erstellt eine Klasse enthält, die leeren Strings/Arrays aus Strings initialisiert. Dann ruft eine Funktion in dieser Klasse Daten von Google Firebase ab, um diese Zeichenfolgen zu füllen.

als in einer Viewcontroller-Klasse möchte diese zwei Zeichenfolgen abrufen. Wie macht es das richtig? bis jetzt habe ich viele verschiedene Ideen ausprobiert, aber ich bekomme entweder leere Strings (wie am Anfang der Klasse initialisiert) oder ich bekomme Fehler

idealerweise jedes Mal, wenn die viewdidload() (in diesem Fall) der Viewcontroller-Klasse i heißt möchte, dass eine Instanz der Klasse mit aktuellen Daten erstellt wird.

class RetrieveDatabase { 

    //static let sharedInstance = RetrieveDatabase() 

    var allMessages = [[String]]() 
    var messages = [String]() 
    var categorieNames = [String]() 

    func loadGoogleValue() -> (allMessages: [[String]], categorieNames: [String]) { 

     //this function works, the arrays contain type [string] and string                       
     return (self.allMessages, self.categorieNames) 
    } 

    /* 
    -> i tried initializers in so many variations... 
    init(allMessages: [[String]], categorieNames: [String]) { 
     self.allMessages = loadGoogleValue().allMessages 
     self.categorieNames = loadGoogleValue().categorieNames 
     messages = [] 
    } 
    */ 

} 

hier der Code aus der Viewcontroller Klasse:

class SettingsView: UIViewController { 
    let retrieveDatabase = RetrieveDatabase.//tried everything here, only errors 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = retrieveDatabase.categorieNames[0] 
    } 
} 
+0

cmon guys? jemand? – felixmp

+0

Warum deklarieren Sie 'retrieveDatabase' Variable nicht so? 'Lassen Sie retrieveDatabase = RetrieveDatabase()' –

+0

danke für Ihre Antwort, die Zeichenfolgen sind immer noch beide leer, wenn sie aufgerufen werden ... – felixmp

Antwort

0

ich Ihren Code etwas vereinfacht haben, die Sie leicht in einem Spielplatz ausprobieren können. Wenn Sie mit einer funktionierenden Version beginnen, können Sie vielleicht den Unterschied zwischen dieser und der, die Ihnen Probleme bereitet, sehen.

class RetrieveDatabase { 
    var allMessages = [[String]]() 
    var messages = [String]() 
    var categorieNames = [String]() 

    init() { 
     messages.append("Hi") 
     messages.append("Hello") 
     allMessages.append(messages) 
     categorieNames.append("SALUTATIONS") 
    } 

    func loadGoogleValue() -> (allMessages: [[String]], categorieNames: [String]) { 
     return (self.allMessages, self.categorieNames) 
    } 
} 

class SettingsView { 
    let retrieveDatabase = RetrieveDatabase() 

    func caller() { 
     print(retrieveDatabase.loadGoogleValue().allMessages) 
     print(retrieveDatabase.loadGoogleValue().categorieNames) 
    } 
} 

let test = SettingsView().caller() 

Da gibt es kaum einen Unterschied zwischen dem, was ich getan habe, und den Code, den Sie oben in deinem Kommentar, ich vermute, es ist etwas, das Sie verlassen haben heraus darüber, wie Strings zu dem Arrays hinzugefügt werden.

+0

danke. Also habe ich das Problem gefunden. Die loadgooglevalue-Funktion ist async mit meinem Code. Es funktioniert wie in es erstellt die Zeichenfolgen mit den Daten von Firebase, aber die Funktion wartet nicht darauf und gibt nur die leeren Zeichenfolgen zurück. Ich bin ziemlich neu Programmierung so krank verbringen den Nachmittag versuchen, async Programmierung zu verstehen. Ziel für den Tag: Mach das! nochmals vielen Dank und Entschuldigung für die Hektik. – felixmp

Verwandte Themen