wie einzelne Inhalte einer struct ausgeben?

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

  • wie einzelne Inhalte einer struct ausgeben?

    Hi, ich grüße alle!
    Ich schreibe eine kleine APP für unser Unternehmen. Dabei lese ich fröhlich vie Jason request die Dinge aus
    unserer Datenbank aus die ich so brauche.

    Ich habe hier ein kleine Codeschnipsel (ab)geschrieben - nun habe ich in einer struct mein Ergebnis der
    José drinnen - aber wie zum Himmel kann ich da einzelne Inhalte rausziehen. Ich glaub ich seh den Baum
    großen Wald nicht mehr. Bestimmt saudoofe Frage - aber ich komme gerade nicht weiter.


    Hier der Code den ich aus dem Internet habe.

    Hier meine Frage: wie kann ich jetzt z.B. den Namen des Course einzeln ausgeben?

    print(Course.name) geht nicht ... sind ja auch mehrer Course Strukturen angelegt.

    Hier in dem Beispiel sind es zwei. Wie kriege ich jetzt einzeln Inhalte davon mit print() ausgegeben??

    Geht gar nicht mit struct? Ok - dann wie mache ich es, dass mein Jason je "Zeile" in einem Array steht
    - oder was auch immer man dafür nutzt?

    Danke.
    FraSo

    Quellcode

    1. //
    2. // ViewController.swift
    3. // JsonParseSwift4
    4. //
    5. // Created by Brian Voong on 6/30/17.
    6. // Copyright © 2017 Lets Build That App. All rights reserved.
    7. //
    8. import UIKit
    9. struct WebsiteDescription: Decodable {
    10. let name: String
    11. let description: String
    12. let courses: [Course]
    13. }
    14. struct Course: Decodable {
    15. let id: Int?
    16. let name: String?
    17. let link: String?
    18. let imageUrl: String?
    19. // init(json: [String: Any]) {
    20. // id = json["id"] as? Int ?? -1
    21. // name = json["name"] as? String ?? ""
    22. // link = json["link"] as? String ?? ""
    23. // imageUrl = json["imageUrl"] as? String ?? ""
    24. // }
    25. }
    26. class ViewController: UIViewController {
    27. override func viewDidLoad() {
    28. super.viewDidLoad()
    29. let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/courses_missing_fields"
    30. guard let url = URL(string: jsonUrlString) else { return }
    31. URLSession.shared.dataTask(with: url) { (data, response, err) in
    32. //perhaps check err
    33. //also perhaps check response status 200 OK
    34. guard let data = data else { return }
    35. let dataAsString = String(data: data, encoding: .utf8)
    36. print(dataAsString)
    37. do {
    38. // let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
    39. // print(websiteDescription.name, websiteDescription.description)
    40. let courses = try JSONDecoder().decode([Course].self, from: data)
    41. print(courses)
    42. } catch let jsonErr {
    43. print("Error serializing json:", jsonErr)
    44. }
    45. }.resume()
    46. // let myCourse = Course(id: 1, name: "my course", link: "some link", imageUrl: "some image url")
    47. // print(myCourse)
    48. }
    49. }
    Alles anzeigen



    so sieht das übrigens im Infotext aus in xcode:


    Quellcode

    1. ptional("[{\"id\":1,\"name\":\"Instagram Firebase\",\"link\":\"https://www.letsbuildthatapp.com/course/instagram-firebase\",\"imageUrl\":\"https://letsbuildthatapp-videos.s3-us-west-2.amazonaws.com/04782e30-d72a-4917-9d7a-c862226e0a93\",\"number_of_lessons\":49},{\"id\":4,\"name\":\"Kindle Basic Training\",\"link\":\"https://www.letsbuildthatapp.com/basic-training\",\"imageUrl\":\"https://letsbuildthatapp-videos.s3-us-west-2.amazonaws.com/a6180731-c077-46e7-88d5-4900514e06cf\",\"number_of_lessons\":19},{\"name\":\"Yelp\"}]")
    2. [JsonParseSwift4.Course(id: Optional(1), name: Optional("Instagram Firebase"), link: Optional("https://www.letsbuildthatapp.com/course/instagram-firebase"), imageUrl: Optional("https://letsbuildthatapp-videos.s3-us-west-2.amazonaws.com/04782e30-d72a-4917-9d7a-c862226e0a93")), JsonParseSwift4.Course(id: Optional(4), name: Optional("Kindle Basic Training"), link: Optional("https://www.letsbuildthatapp.com/basic-training"), imageUrl: Optional("https://letsbuildthatapp-videos.s3-us-west-2.amazonaws.com/a6180731-c077-46e7-88d5-4900514e06cf")), JsonParseSwift4.Course(id: nil, name: Optional("Yelp"), link: nil, imageUrl: nil)]
    Apple abhängig :love:
    aus Hessen
  • Danke Dir. ein Array des courses zu zeigen kenne ich ja. aber wir kriege ich dann ein Element aus dem array.

    Also, z.B. den "link" aus dem Array 0.

    print(courses[0]) zeigt mir ja wieder die struct an. Und wie extrahiere ich dass ich einfach sagen kann

    zeige mir den link im array Nr. 0 ?

    Ist das zu simple das ich das nicht finde und erkenne?

    Danke!!
    Apple abhängig :love:
    aus Hessen
  • So. Du bist schon mal mein Held. Ich weiß, für 99% der der Anwesenden ist das eine Frage wegen der man seine Hand vors Gesicht schlägt.

    Tut mir leid - und ganz vielen Dank.

    Noch so eine Frage:

    diesen print( kann ich ja nur in der do Schleife machen - was muss ich tun um das courses nun globaler zu machen?

    Außerhalb der do Schleife kriege ich eine Fehlermeldung. Ich habe das noch nicht kapiert wie ich dieses Array global machen kann.

    Oder das ganze in eine func packen? und das Array zurückgeben?

    Danke!
    Apple abhängig :love:
    aus Hessen
  • Danke für die Hinweise. Viel zu viel Info. Ich glaube ich brauche mal einen Text der die Grundstruktur von diesen Variablendinger erklärt.

    Es ist mir ein absolutes Rätsel warum ich in der do { die Ausgabe print("Ausgabe: ",courses[0].name!) richtig kommt, sobald aber die do { mit der
    Klammer } beendet ist und ich die exact gleiche Ausgabe testweise haben möchte die Fehlermeldung kommt: Use of unresolved identifier 'courses'; did you mean 'Course'?

    Wäre es möglich mir das zu erklären und eine Lösung zu nennen? Ich habe jetzt abends und vormittags Stunden verbraucht da Sachen zu lesen die
    mich kein Stück weiter gebracht haben.

    Was ich auch nicht verstehe - ich kann ja mit courses[0].name! in der do Schleife den Namen ausgeben. Super. Aber ich kann nicht das ganze Array anzeigen mit
    print(courses).

    Kann mal bitte einer meinen Kopf hier geraderücken? Danke.
    Apple abhängig :love:
    aus Hessen
  • Das Thema ist Scoping: Variablen sind nur in den Blöcken bekannt, in denen sie deklariert wurden (hierbei sind Schachtelungen möglich). Wenn Du im do eine Variable deklarierst, gibt es sie eben nur dort und in untergeordneten Blöcken. Gemein wird es, wenn außerhalb eine andere Variable mit gleichem Namen deklariert wird...

    Die Stichworte sind wie gesagt „Scope“ oder auf Deutsch „Gültigkeitsbereich“ von Variablen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo, ich habe mir das Dokument von nussratte mehrfach angeschaut. Insbesondere das Beispiel "let three = 3" ff. war mir sehr Aufschlussreich. Danke dafür.

    Ich habe meine kleine API geschrieben. Die liegt nun als func vor und schreibt auch schön in das Array courses meine json Daten. Trotz der Lektüre dank Nussratte und der kleinen unzureichenden Erleuchtung kriege ich die Daten eben nur in dieser Funktion gezeigt.

    Wenn ich diese in meinem TableViewController aufrufe kann ich auch schön meine Daten sehen wie die in der Funktion bearbeitet werden.. Nun, die dann in anderen Funktionen nutzbar zu machen schaffe ich nicht ohne Hilfe.

    Daher würde es mir sehr helfen wie ich einen Return hinbekomme sodaß ich auf die Daten global zugreifen kann... bitttteeeeeeeee. Das kann doch nicht so schwer sein....... aber eben doch unlösbar. ich würd gerne einfach mal anfangen meine App zu schreiben und nicht nun seit Tagen mich mit diesem Problem auseinandersetzen welches ich ohne eure Hilfe anscheinend nicht lösen kann.


    Nochwas: wenn ich die Funktion so nennen: static func fetchFahrten() -> [Fahrtenbuch] { dann hab ich keine Ahnung was ich im return Statement eintragen muss. Egal was ich probiere an den Return dranzuhängen ... es gibt einen Fehler.

    return [Fahrtenbuch]
    }
    }

    return [courses]
    }
    }



    keine Ahnung..... bittteeeee erlöst mich von dieser Qual und helft mir endlich mal was weiterzuschreiben. Meine bisherigen Workarounds sind nicht quick aber DIRTY.

    Danke.

    (beispiel-App kommt von David Tran an die ich mich dran hängen wollte)

    Quellcode

    1. //
    2. // Video.swift
    3. // Play Local Videos
    4. //
    5. // Created by David Tran on 8/21/18.
    6. // Copyright © 2018 Wallie. All rights reserved.
    7. //
    8. import Foundation
    9. import UIKit
    10. struct Fahrtenbuch: Decodable {
    11. let id: String
    12. let datetime: String
    13. let shift_state: String
    14. let speed: String
    15. let power: String
    16. let native_location_supported: String
    17. let native_latitude: String
    18. let native_longitude: String
    19. let native_type: String
    20. let latitude: String
    21. let longitude: String
    22. let heading: String
    23. let gps_as_of: String
    24. let timestamp: String
    25. let date: String
    26. let str: String
    27. let ort: String
    28. let land: String
    29. let odometer: String
    30. let info: String
    31. let deleted: String
    32. let battery_level: String
    33. }
    34. func fetchFahrten() {
    35. let myIndexID = "nil"
    36. let device_id = UIDevice.current.identifierForVendor!.uuidString
    37. let url = URL(string: "https://xxxx.xxxx.xxxx/tesla/service_tesla.php")
    38. var request : URLRequest = URLRequest(url: url!)
    39. request.httpMethod = "POST"
    40. let postString = "id=1&ios=neu&suchstr=\(myIndexID)&device=\(device_id)"
    41. request.httpBody = postString.data(using: String.Encoding.utf8)
    42. let courses = Array<Any>()
    43. URLSession.shared.dataTask(with: request) { (data, response, err) in
    44. DispatchQueue.main.async {
    45. //perhaps check err
    46. //also perhaps check response status 200 OK
    47. guard let data = data else { return }
    48. let dataAsString = String(data: data, encoding: .utf8)
    49. print("datastring: ",dataAsString!)
    50. do {
    51. let courses = try JSONDecoder().decode([Fahrtenbuch].self, from: data)
    52. //let videoReturn.append()
    53. } catch let jsonErr {
    54. print("Error serializing json:", jsonErr)
    55. }
    56. }
    57. }.resume()
    58. return
    59. }
    Alles anzeigen
    Apple abhängig :love:
    aus Hessen