pointer auf ein object in einem dict

  • pointer auf ein object in einem dict

    hallo leute,

    ich habe ein nsdictionary mit einer n-anzahl von ebenen, also das dict enthällt dicts dir wiederrum dicts enthalten.
    gibt es eine mögllichkeit mir einen pointer zu einem dict in einer ebene geben zu lassen damit ich in dieser ebene direkt lesen und schreiben zu können ohne auf die root dicts rücksicht nehmen zu müssen?
  • ok das war vielleicht ein bisschen doof erklärt.
    also. so greifen ich normalerweise auf ein object in einem dict zu:

    id x = [[[dict objectForKey@"key1"] objectForKey@"key2"] objectForKey@"key3"];

    da ich aber nicht weiss wieviele ebenen das dict hat und im prinzip unendllich haben kann ist dieser zugriff sehr statisch.
    ich suche eine möglichkeit über einen pointer, der direkt auf ein tieferes object zeigt,
    direkt lesen und schreiben zu können ohne auf schleifen und vor allem bei schreiben
    auf recursive schleifen zurückgreifen zu müssen.
  • Original von macuser
    da ich aber nicht weiss wieviele ebenen das dict hat und im prinzip unendllich haben kann ist dieser zugriff sehr statisch.
    ich suche eine möglichkeit über einen pointer, der direkt auf ein tieferes object zeigt,
    direkt lesen und schreiben zu können ohne auf schleifen und vor allem bei schreiben
    auf recursive schleifen zurückgreifen zu müssen.

    Wenn Du nicht weißt, wie viele Ebenen vorhanden sind, dann kannst Du Dir auch keinen Pointer auf ein tieferes Objekt geben lassen. Das widerspricht sich doch, oder?

    So eine objectForKey: Orgie kann man allerdings mit KVC eleganter schreiben:

    Quellcode

    1. id x = [dict valueForKeyPath:@"key1.key2.key3"];
    Du musst aber den Keypath trotzdem kennen.

    Michael
  • Du kannst mit -keyEnumerator und -objectEnumerator das Ditionary abzählen. Ansonsten kannst du dir mit KVC (siehe Michael) den String basteln.

    Aber willst du nicht einfach mal sagen, was du vorhast?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Michael
    Original von macuser
    da ich aber nicht weiss wieviele ebenen das dict hat und im prinzip unendllich haben kann ist dieser zugriff sehr statisch.
    ich suche eine möglichkeit über einen pointer, der direkt auf ein tieferes object zeigt,
    direkt lesen und schreiben zu können ohne auf schleifen und vor allem bei schreiben
    auf recursive schleifen zurückgreifen zu müssen.

    Wenn Du nicht weißt, wie viele Ebenen vorhanden sind, dann kannst Du Dir auch keinen Pointer auf ein tieferes Objekt geben lassen. Das widerspricht sich doch, oder?

    So eine objectForKey: Orgie kann man allerdings mit KVC eleganter schreiben:

    Quellcode

    1. id x = [dict valueForKeyPath:@"key1.key2.key3"];
    Du musst aber den Keypath trotzdem kennen.

    Michael


    ich bin begeistert, genau das hab ich gesucht. den keypath hab ich.
    super. danke.
  • Original von macuser
    ok das war vielleicht ein bisschen doof erklärt.
    also. so greifen ich normalerweise auf ein object in einem dict zu:

    id x = [[[dict objectForKey@"key1"] objectForKey@"key2"] objectForKey@"key3"];

    da ich aber nicht weiss wieviele ebenen das dict hat und im prinzip unendllich haben kann ist dieser zugriff sehr statisch.
    ich suche eine möglichkeit über einen pointer, der direkt auf ein tieferes object zeigt,
    direkt lesen und schreiben zu können ohne auf schleifen und vor allem bei schreiben
    auf recursive schleifen zurückgreifen zu müssen.

    Mir ist auch nicht ganz klar, was Du eingentlich bezwecken möchtest. Möchtest Du eine Baumstruktur anlegen und verwalten?

    Wenn Du einen schnellen Zugriff zu speziellen Ästen in diesem Baum haben möchtest, dann kannst Du Dir die Referenz auf diese Äste selbstverständlich auch anderweitig merken. Allerding wird der Synchronisationsaufwand höher, wenn Du Dir an mehreren Stellen die Referenz auf das selbe Objekt (Ast) merkst. Alternativ merkst Du Dir nur den KeyPath zu diesen Objekten, welchen Du je nach Veränderung am Baum jedoch auch anpassen, also synchronisieren musst.

    Wenn man also wüsste, was Dein Ziel ist, dann könnte man Dir evtl. auch die dazu passende Lösung anbieten. ;)
  • Original von MCDan
    Original von macuser
    ok das war vielleicht ein bisschen doof erklärt.
    also. so greifen ich normalerweise auf ein object in einem dict zu:

    id x = [[[dict objectForKey@"key1"] objectForKey@"key2"] objectForKey@"key3"];

    da ich aber nicht weiss wieviele ebenen das dict hat und im prinzip unendllich haben kann ist dieser zugriff sehr statisch.
    ich suche eine möglichkeit über einen pointer, der direkt auf ein tieferes object zeigt,
    direkt lesen und schreiben zu können ohne auf schleifen und vor allem bei schreiben
    auf recursive schleifen zurückgreifen zu müssen.

    Mir ist auch nicht ganz klar, was Du eingentlich bezwecken möchtest. Möchtest Du eine Baumstruktur anlegen und verwalten?

    Wenn Du einen schnellen Zugriff zu speziellen Ästen in diesem Baum haben möchtest, dann kannst Du Dir die Referenz auf diese Äste selbstverständlich auch anderweitig merken. Allerding wird der Synchronisationsaufwand höher, wenn Du Dir an mehreren Stellen die Referenz auf das selbe Objekt (Ast) merkst. Alternativ merkst Du Dir nur den KeyPath zu diesen Objekten, welchen Du je nach Veränderung am Baum jedoch auch anpassen, also synchronisieren musst.

    Wenn man also wüsste, was Dein Ziel ist, dann könnte man Dir evtl. auch die dazu passende Lösung anbieten. ;)


    ja was soll ich sagen, ich habs manchmal nicht so mit dem erklären.
    ja es soll eine baumstrucktur werden.