Grndlagen - Aufruf einer Methode

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Grndlagen - Aufruf einer Methode

    Hallo zusammen!

    Ich bin immer wieder erstaunt, an welch grundlegenden Dingen ich immer wieder hängen bleibe... :/ Diesmal geht es um einen simplen Aufruf einer Methode. Es gibt eine Klasse, die die Methode laden() beinhaltet- hir sollen die Eigenschaften des Objektes aus der Datenbank geladen werden.:


    Quellcode

    1. class OBA_Dienst {
    2. var unternehmensname = ""
    3. var fachbereich = ""
    4. var strasse = ""
    5. var plz = ""
    6. var ort = ""
    7. var telefonnummer = ""
    8. var telefonnummer2 = ""
    9. var email = ""
    10. var email2 = ""
    11. var fax = ""
    12. func laden() {
    13. guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
    14. return
    15. }
    16. let context = appDelegate.persistentContainer.viewContext
    17. let entityName = "Dienst"
    18. let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    19. do {
    20. let results = try context.fetch(request)
    21. for r in results {
    22. if let result = r as? NSManagedObject {
    23. unternehmensname = (result.value(forKey: "unternehmensname") as? String) ?? ""
    24. fachbereich = (result.value(forKey: "fachbereich") as? String) ?? ""
    25. strasse = (result.value(forKey: "strasse") as? String) ?? ""
    26. plz = (result.value(forKey: "plz") as? String) ?? ""
    27. ort = (result.value(forKey: "ort") as? String) ?? ""
    28. telefonnummer = (result.value(forKey: "telefonnummer") as? String) ?? ""
    29. telefonnummer2 = (result.value(forKey: "telefonnummer2") as? String) ?? ""
    30. email = (result.value(forKey: "email") as? String) ?? ""
    31. email2 = (result.value(forKey: "email2") as? String) ?? ""
    32. fax = (result.value(forKey: "fax") as? String) ?? ""
    33. }
    34. }
    35. } catch {
    36. print("Fehler beim Lesen der Dienstdaten: \(error)")
    37. }
    38. }
    39. }
    Alles anzeigen

    Nun möchte ich in einer View ein Objekt der Klasse OBA_Dienst bilden um dort die Kontaktdaten des Dienstes dort anzeigen zu lassen, beim Aufruf der Methode laden bekomme ich jedoch den Fehler Consecutive declarations on a line must be separated by ';'


    Quellcode

    1. struct kontaktdaten_dienst: View {
    2. var oba = OBA_Dienst()
    3. oba.laden()
    4. var body: some View {
    5. Text("Ihre Offenen Hilfen:")
    6. .font(.largeTitle)
    7. }
    8. }


    Gut, scheinbar ist es der falsche Weg eine Variable der entspr. Klasse zu initiieren und mit Inhalten zu füllen. Wenn aber nicht so, wie? Dank im Voraus für jede Hilfe!
  • Ok, habe die Lösung jetzt selber gefunden. Mir erschließt sich zwar nicht der Sinn der Idee, warum ich die Methode laden() hier nur innerhalb einer Funktion aufrufen kann nicht aber innerhalb der View, aber ich muss ja nicht gleich alles auf Anhieb verstehen:

    Quellcode

    1. func get_oba() -> OBA_Dienst{
    2. print("Lese Daten des OBA-Dienstes")
    3. let oba = OBA_Dienst()
    4. oba.laden()
    5. return oba
    6. }
    7. struct kontaktdaten_dienst: View {
    8. let meine_oba = get_oba()
    9. var body: some View {
    10. VStack {
    11. Text("Ihre Offenen Hilfen:")
    12. .font(.largeTitle)
    13. Text(meine_oba.unternehmensname)
    14. }
    15. }
    16. }
    Alles anzeigen
  • flori-software schrieb:

    Quellcode

    1. struct kontaktdaten_dienst: View {
    2. var oba = OBA_Dienst()
    3. oba.laden()
    4. var body: some View {
    5. Text("Ihre Offenen Hilfen:")
    6. .font(.largeTitle)
    7. }
    8. }
    Das geht so nicht, weil so eine struct Deklaration kompiliert und nicht ausgeführt wird. Du kannst aber Variablen in Swift auch per Closure initialisieren:

    Quellcode

    1. struct kontaktdaten_dienst: View {
    2. let meine_oba: OBA_Dienst = {
    3. let oba = OBA_Dienst()
    4. oba.laden()
    5. return oba
    6. }()
    7. var body: some View {
    8. VStack {
    9. Text("Ihre Offenen Hilfen:")
    10. .font(.largeTitle)
    11. Text(meine_oba.unternehmensname)
    12. }
    13. }
    14. }
    Alles anzeigen
    Im Prinzip das Selbe, was du selbst schon heraus gefunden hast. Nur dass man sich die separate Funktion sparen kann.
  • Dankeschön für die zwei Antworten, jetzt macht es Sinn!

    Allerdings habe ich das Problem, dass ich die Werte ohne extra Funktionen zu bilden nicht in ein Textfeld einbinden kann. Ich möchte nun einen Bereich, in dem der Benutzer seine eigenen Daten die seinem OBA-Dienst vorliegen wie Telefonnummer etc. einsehen und ggf. aktualisieren kann.

    Quellcode

    1. struct DasBinIch: View {
    2. let kunde: Kunde = {
    3. let mein_kunde = Kunde()
    4. mein_kunde.laden()
    5. return mein_kunde
    6. }()
    7. @State private var email = kunde.email
    8. var body: some View {
    9. VStack {
    10. Text("Das bin ich!")
    11. .font(.largeTitle)
    12. HStack {
    13. Spacer()
    14. Image(systemName: "envelope")
    15. .font(.system(size: 16, weight: .regular))
    16. TextField("meine Emailadresse", text: $email)
    17. Spacer()
    18. }
    19. }
    20. }
    21. }
    Alles anzeigen

    Das funktioniert also nicht. Was hingegen gut funktioniert, ist folgende Lösung:


    Quellcode

    1. func get_meineDaten()->Kunde {
    2. let kunde = Kunde()
    3. kunde.laden()
    4. return kunde
    5. }
    6. func get_email()->String {
    7. let kunde = get_meineDaten()
    8. let email = kunde.email
    9. return email
    10. }
    11. struct DasBinIch: View {
    12. @State private var email = get_email()
    13. var body: some View {
    14. VStack {
    15. Text("Das bin ich!")
    16. .font(.largeTitle)
    17. HStack {
    18. Spacer()
    19. Image(systemName: "envelope")
    20. .font(.system(size: 16, weight: .regular))
    21. TextField("meine Emailadresse", text: $email)
    22. Spacer()
    23. }
    24. }
    25. }
    26. }
    Alles anzeigen
    Gut, es funktioniert, ist aber etwas umständlich für jede einzelne Eigenschaft die ich in ein Textfeld einfüge eine extra Funktion zu schreiben. Geht das vllt. auch mit weniger Code?... Danke im Voraus!
  • Gut, ich habe verstanden wie es funktioniert...


    Quellcode

    1. func get_meineDaten()->Kunde {
    2. let kunde = Kunde()
    3. kunde.laden()
    4. return kunde
    5. }
    6. struct DasBinIch: View {
    7. @State private var kunde = get_meineDaten()
    8. var body: some View {
    9. GeometryReader { geo in
    10. VStack {
    11. Text("Das bin ich!")
    12. .font(.largeTitle)
    13. HStack {
    14. Image(systemName: "person.crop.circle").font(.system(size: 16, weight: .medium))
    15. VStack {
    16. TextField("Nachname", text: self.$kunde.nachname)
    17. TextField("Vorname", text: self.$kunde.vorname)
    18. }
    19. }
    20. .padding(20)
    21. HStack {
    22. Image(systemName: "house").font(.system(size: 16, weight: .medium))
    23. VStack {
    24. TextField("Strasse", text: self.$kunde.strasse)
    25. HStack {
    26. TextField("PLZ", text: self.$kunde.plz)
    27. .frame(width: 100)
    28. Text("")
    29. TextField("Ort", text: self.$kunde.ort)
    30. }
    31. }
    32. }
    33. .padding(20)
    Alles anzeigen
    Danke fürs Mitdenken!