JSON, TableView & NSRangeException

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

  • JSON, TableView & NSRangeException

    Hallo,

    wie der name ja schon fast verrät, versuche ich eine TableView mit Daten aus einem JSON zu füllen.
    Das klappt auch alles wunderbar. Meine TableView ist Dynamisch und enthält mehrere Labels. Der Count der TableView ist gesetzt, da gibt es auch keine Probleme.

    Das Problem ist, das es einige Labels gibt, die aus dem JSON nur daten anzeigen sollen, wenn diese auch vorhanden sind.

    Das JSON sieht so aus:
    2016-03-16_00h22_24.png

    A gibt mir den Count für die Items in der TableView
    B soll in einem Label angezeigt werden, wenn vorhanden

    Also habe ich es so versucht, OHNE erfolg:

    Quellcode

    1. cell.nameA = parseJSON["A"]?[indexPath.row]["name"] as? String
    2. if((parseJSON["B"]?[indexPath.row]) != nil) {
    3. cell.nameB = parseJSON["B"]?[indexPath.row]["name"] as? String
    4. }
    Vielleicht hat ja jemand eine idee, wie ich das Problem lösen kann?
    404 Not Found
  • Wahrscheinlich musst du beim Array b auf die Länge testen. Etwas leserlicher Code hilft meistens dabei:

    Quellcode

    1. if let b = parseJSON["B"] where b.count > indexPath.row {
    2. cell.nameB = b[indexPath.row]["name"] as? String
    3. }
    BTW: Eine eigene Modellklasse für die Daten und ein einzelnes Datenarray, die die Werte für a und b enthält, würde das Ganze sicherlich noch lesbarer machen.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Wahrscheinlich musst du beim Array b auf die Länge testen. Etwas leserlicher Code hilft meistens dabei:

    Quellcode

    1. if let b = parseJSON["B"] where b.count > indexPath.row {
    2. cell.nameB = b[indexPath.row]["name"] as? String
    3. }
    BTW: Eine eigene Modellklasse für die Daten und ein einzelnes Datenarray, die die Werte für a und b enthält, würde das Ganze sicherlich noch lesbarer machen.

    lol sorry aber swift ist für mich immer so leserlich wie dieser post den ich hier gerade schreibe. if let .. where.. was ist denn das für ein konstrukt. übersetzt das mal. wenn lasse ... wo. total bullshit.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • ???

    Das where bedeutet bei if let Bedingungen letztendlich soviel wie &&:

    Quellcode

    1. if let v1 = ..., v2 = ... where v1.a1 = ... and v2.abc = ... {
    2. }
    Es trennt die komma-separierten let-Zuweisungsbedingungen von den gewöhnlichen Bedingungen.

    BTW: Wenn man das nicht mag, kann man auch verschachtelte Bedingungen verwenden. Das ist auch noch sauberer, als diese Zugriffsketten, die sich auch noch wiederholen.
    „Meine Komplikation hatte eine Komplikation.“
  • Thallius schrieb:

    macmoonshine schrieb:

    Wahrscheinlich musst du beim Array b auf die Länge testen. Etwas leserlicher Code hilft meistens dabei:

    Quellcode

    1. if let b = parseJSON["B"] where b.count > indexPath.row {
    2. cell.nameB = b[indexPath.row]["name"] as? String
    3. }
    BTW: Eine eigene Modellklasse für die Daten und ein einzelnes Datenarray, die die Werte für a und b enthält, würde das Ganze sicherlich noch lesbarer machen.
    lol sorry aber swift ist für mich immer so leserlich wie dieser post den ich hier gerade schreibe. if let .. where.. was ist denn das für ein konstrukt. übersetzt das mal. wenn lasse ... wo. total bullshit.

    Gruß

    Claus
    hast du dich denn auch mal damit auseinander gesetzt oder schreibst du das nur weil du es ohne Vorkenntnisse nicht verstehst? ;)
  • Thallius schrieb:

    macmoonshine schrieb:

    Wahrscheinlich musst du beim Array b auf die Länge testen. Etwas leserlicher Code hilft meistens dabei:

    Quellcode

    1. if let b = parseJSON["B"] where b.count > indexPath.row {
    2. cell.nameB = b[indexPath.row]["name"] as? String
    3. }



    BTW: Eine eigene Modellklasse für die Daten und ein einzelnes Datenarray, die die Werte für a und b enthält, würde das Ganze sicherlich noch lesbarer machen.
    lol sorry aber swift ist für mich immer so leserlich wie dieser post den ich hier gerade schreibe. if let .. where.. was ist denn das für ein konstrukt. übersetzt das mal. wenn lasse ... wo. total bullshit.

    Gruß

    Claus
    let v1 = something()

    Weise v1 den Rückgabewert von something() zu.

    Quellcode

    1. if let v1 = somethingMightBeNil() {
    2. }

    Weise v1 den Rückgabewert von somethingMightBeNil() zu. Führe den bedingten Code nur aus, wenn die Zuweisung einen richtigen Wert ergibt und nicht nil ist.

    Quellcode

    1. if let v1 = somethingMightBeNil() where v1.count > 0 {
    2. }

    S.o. + Der Code wird nur ausgeführt, wenn zusätzliche mit where definierte Bedingungen erfüllt sind.

    Wenn man sich damit erstmal 'angefreundet' hat, ein schöner weg Code kurz und knapp und gut lesbar zu halten.

    Das where ist glaube ich aus SQL entliehen.

    SQL-Abfrage

    1. SELECT VorlNr, Titel FROM Vorlesung WHERE Titel = 'ET';

    Also vollkommen gängige Praxis und mit Nichten eine ekelhafte Swifterfindung...
  • tsunamix schrieb:

    Also vollkommen gängige Praxis und mit Nichten eine ekelhafte Swifterfindung...
    Naja, in SQL trennt es die FROM-Klausel von den Bedingungen. In Swift hat es die Bedeutung von und. Der schlichte Grund, warum Apple hier nicht einfach && verwendet hat, ist wahrscheinlich, dass der Ausdruck dann mehrdeutig werden könnte:

    Quellcode

    1. if let flag = optionalBinaryExpression() && a > b {
    2. ...
    3. }
    „Meine Komplikation hatte eine Komplikation.“
  • tsunamix schrieb:

    ch kenne mich mit SQL nicht so aus, aber in beiden Fällen hängt doch die mit where definierte Bedingung von einem vorher erhaltenen Wert ab, oder? Beim &&-Und steht die Bedingung für sich alleine.
    Naja, wenn du die FROM-Klausel mit let vergleichst, dann deklariert sie zwar Variablen, das aber bedingungslos. Die FROM-Klausel kann nicht fehlschlagen.


    tsunamix schrieb:

    Ich wollte nur anmerken, daß dieses where nicht vollkommen aus der Luft gegriffen ist...
    Da hast du recht, dass es das Schlüsselwort where gibt's auch noch in anderen Programmiersprachen gibt. Häufig wird es dort auch ähnlich wie ein nachgestelltes if verwendet, z. B.: Ausdruck where Bedingung
    „Meine Komplikation hatte eine Komplikation.“