Generische Methode für mehrere Klassen

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

  • Sein Assert machte in seiner bisherigen Implementierung absolut Sinn. Es löst nur nicht sein Problem. Es dient etwas ganz anderem, wie man an den zahlreichen anderen Asserts sehen kann. Und wie man wissen kann, wenn man weiß, wozu Asserts da sind.
    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"?
  • uniique schrieb:

    gritsch schrieb:

    uniique schrieb:

    nicht mich verwirren mit so vielen Zitaten, ich versuche zu verstehen ;)


    NSClassFromString Obtains a class by name.

    du hast danach KEINE instanz von der du werte holen kannst.
    aber da steht doch auch:

    Return Value
    The class object named by aClassName, or nil if no class by that name is currently loaded. If aClassName is nil, returns nil.
    somit müsste ich doch per

    Quellcode

    1. id known = NSClassFromString(@"User");

    für known dann die User Class zurückbekommen oder nicht?


    nein!

    Quellcode

    1. Class classOfMyString = NSClassFromString(myString);


    nichts anderes!
  • Amin Negm-Awad schrieb:

    Sein Assert machte in seiner bisherigen Implementierung absolut Sinn. Es löst nur nicht sein Problem. Es dient etwas ganz anderem, wie man an den zahlreichen anderen Asserts sehen kann. Und wie man wissen kann, wenn man weiß, wozu Asserts da sind.


    NEIN, dieses assert macht keinen sinn. hier nochmal für dich zum draus-schlau-werden:

    Quellcode

    1. assert([known isKindOfClass:[known class]]);


    und komm mir nicht damit dass er mit dem konstrukt auf "known != nil" testen will!
  • ja das mit dem assert habe ich verstanden, es bedeutet ja nicht dass ich damit known auf eine bestimmte Klasse setze sondern nur voraussetze dass known eine bestimmte Klasse ist. Ich muss jetzt halt nur überlegen, wie ich das ganze dann per KVC realisiere und auch die Klassenmethode

    Quellcode

    1. known = [Klasse insertNewDataWithProperties:properties inManagedObjectContext:self.userDataContext];
    so in der Methode anpasse damit sie für jede Klasse funktioniert.
    [window close]
  • uniique schrieb:

    gritsch schrieb:

    uniique schrieb:

    nicht mich verwirren mit so vielen Zitaten, ich versuche zu verstehen ;)


    NSClassFromString Obtains a class by name.

    du hast danach KEINE instanz von der du werte holen kannst.
    aber da steht doch auch:

    Return Value
    The class object named by aClassName, or nil if no class by that name is currently loaded. If aClassName is nil, returns nil.
    somit müsste ich doch per

    Quellcode

    1. id known = NSClassFromString(@"User");

    für known dann die User Class zurückbekommen oder nicht?

    Du wirfst hier – wie das aus sprachlichen Gründen häufig geschieht, hier kommt es nur darauf an – Klassenobjekt und Instanzobjekt durcheinander.

    Du bekommst mit NSClassFromString das Klassenobjekt zurück. Daraus musst du dann noch ein Instanzobjekt machen. Das geht wie gehabt mit +alloc und -init. Anstelle eines klassenbezeichners setzt du einfach das gelieferte Klassenobjekt ein.
    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"?
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    Sein Assert machte in seiner bisherigen Implementierung absolut Sinn. Es löst nur nicht sein Problem. Es dient etwas ganz anderem, wie man an den zahlreichen anderen Asserts sehen kann. Und wie man wissen kann, wenn man weiß, wozu Asserts da sind.


    NEIN, dieses assert macht keinen sinn. hier nochmal für dich zum draus-schlau-werden:

    Quellcode

    1. assert([known isKindOfClass:[known class]]);


    und komm mir nicht damit dass er mit dem konstrukt auf "known != nil" testen will!

    Doch es macht in seiner bisherigen Implementierung Sinn. Er hat es nämlich bisher nur für eine Klasse implementiert. Und da Arrays ihre Elemente auf id typisieren, will er damit testen, dass es sich um Instanzen der richtigen Klasse handelt. Er zitiert seinen bisherigen Code.

    +++

    Ach, du meintest, dass der Assert, wie er ihn geschrieben hat, keinen Sinn ergibt? Also das war gar nicht auf das Thema bezogen?

    Das stimmt natürlich.
    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"?
  • Amin Negm-Awad schrieb:

    Du bekommst mit NSClassFromString das Klassenobjekt zurück. Daraus musst du dann noch ein Instanzobjekt machen. Das geht wie gehabt mit +alloc und -init. Anstelle eines klassenbezeichners setzt du einfach das gelieferte Klassenobjekt ein.
    demzufolge dann einfach

    Quellcode

    1. id known = [[NSClassFromString(@"classname") alloc]init];


    damit habe ich ja dann hoffentlich ein Instanzobjekt der Klasse die ich übergebe
    [window close]
  • uniique schrieb:

    Amin Negm-Awad schrieb:

    Du bekommst mit NSClassFromString das Klassenobjekt zurück. Daraus musst du dann noch ein Instanzobjekt machen. Das geht wie gehabt mit +alloc und -init. Anstelle eines klassenbezeichners setzt du einfach das gelieferte Klassenobjekt ein.
    demzufolge dann einfach

    Quellcode

    1. id known = [[NSClassFromString(@"classname") alloc]init];


    damit habe ich ja dann hoffentlich ein Instanzobjekt der Klasse die ich übergebe

    Jepp, das müsste gehen. Aber damit das klar ist: Du willst das ja gerade dynamisch machen. Also musst du eine Property haben, die das Klassenobjekt (oder den Namen) aufnimmt. Wenn du den Klassennamen wieder fix in den Code schreibst, gewinnst du ja nichts. Also in etwa

    Quellcode

    1. id known = [[self.nodeClass alloc]init];


    Aber das sind Imlementierungsdetails. Das System hast du gerafft.
    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"?
  • Das wirkt auf mich wieder wie so ein wackeliges 'statisch dynamisch typisiertes' Dinges, dessen Nutzen mir noch nicht ganz klar ist.

    Aber solange du deinen Code schon auf jedes zu füllende ManagedObject anpasst, wird das schon klappen. :)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • achso, ja klar wollte das nur verdeutlichen, classname hole ich mir dann entweder über einen Parameter der Methode oder einer Property der Klasse, obwohl ich sehr wahrschinlich über Property gehen werde da ich da ja schon einen Property "entityName" habe die ja gesetzt ist, wenn ich die Methode aufrufe, würde dann so aussehen

    Quellcode

    1. id known = [[NSClassFromString(self.entityName) alloc]init]


    wo es gerade noch etwas hapert ist bei der Klassenmethode die weiter unten aufgerufen wird, aber das kriege ich denke ich mal auch noch hin :)
    [window close]
  • Lucas de Vil schrieb:

    Das wirkt auf mich wieder wie so ein wackeliges 'statisch dynamisch typisiertes' Dinges, dessen Nutzen mir noch nicht ganz klar ist.

    Aber solange du deinen Code schon auf jedes zu füllende ManagedObject anpasst, wird das schon klappen. :)

    Bei der Instantierung muss man die Klasse kennen. Daran führt kein Weg vorbei. Nur bei prototypenbasierter Programmierung ist das anders. Das verstehen aber heise-Redakteure nicht.

    Wenn du statt einer Eigenschaft dir ein Delegate vorstellst, ist das sogar formal verpackt.

    BTW: Auch die Coder fragen nach, welche Klasse genommen werden soll.
    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"?
  • uniique schrieb:

    achso, ja klar wollte das nur verdeutlichen, classname hole ich mir dann entweder über einen Parameter der Methode oder einer Property der Klasse, obwohl ich sehr wahrschinlich über Property gehen werde da ich da ja schon einen Property "entityName" habe die ja gesetzt ist, wenn ich die Methode aufrufe, würde dann so aussehen

    Quellcode

    1. id known = [[NSClassFromString(self.entityName) alloc]init]


    wo es gerade noch etwas hapert ist bei der Klassenmethode die weiter unten aufgerufen wird, aber das kriege ich denke ich mal auch noch hin :)

    Bedenke aber, dass der Entätsname nicht unbedingt der Klassenname sein muss. Vielleicht doch ein Delegate mit einem Protokoll mit der Methode -parser:classForEntityName:.

    Welche Klassenmethode meinst du? id kann auch Klassenobjekte aufnehmen und Class hat dir gritsch schon genannt.
    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"?
  • Lucas de Vil schrieb:

    Das wirkt auf mich wieder wie so ein wackeliges 'statisch dynamisch typisiertes' Dinges, dessen Nutzen mir noch nicht ganz klar ist.

    Aber solange du deinen Code schon auf jedes zu füllende ManagedObject anpasst, wird das schon klappen. :)
    schau dir mal einfach den Sample Code von MVCNetworking an, dort ist die Methode implementiert, das Problem war halt, dass dieses Beispiel nur eine Entity hat. Und deswegen dachte ich mir, ich bastel mir die Methode so um dass sie für x Entities funktioniert, weil ich wie schon gesagt ansonsten für jede einzelne Entity eine eigene Methode schreiben müsste in der ich nur die Klasse verändere und der Rest gleich bleibt.
    [window close]
  • Amin Negm-Awad schrieb:

    uniique schrieb:

    achso, ja klar wollte das nur verdeutlichen, classname hole ich mir dann entweder über einen Parameter der Methode oder einer Property der Klasse, obwohl ich sehr wahrschinlich über Property gehen werde da ich da ja schon einen Property "entityName" habe die ja gesetzt ist, wenn ich die Methode aufrufe, würde dann so aussehen

    Quellcode

    1. id known = [[NSClassFromString(self.entityName) alloc]init]


    wo es gerade noch etwas hapert ist bei der Klassenmethode die weiter unten aufgerufen wird, aber das kriege ich denke ich mal auch noch hin :)

    Bedenke aber, dass der Entätsname nicht unbedingt der Klassenname sein muss. Vielleicht doch ein Delegate mit einem Protokoll mit der Methode -parser:classForEntityName:.

    Welche Klassenmethode meinst du? id kann auch Klassenobjekte aufnehmen und Class hat dir gritsch schon genannt.
    diese hier, die ich dann in jede Klasse (NSManagedObject) implementieren muss

    Quellcode

    1. [User insertNewUserWithProperties:properties inManagedObjectContext:self.userDataContext];
    [window close]
  • Wenn du das nur für alle MOs haben willst, kannst du ja die ids auch auf NSManagedObject* typisieren. Anstelle der Methode verwendest du dann eine von NSManagedObject und setzt die Propertys von Hand (KVC).

    Im schlimmsten Falle gehst du wieder über ein Delegate. Das kann ja immer machen, was es will. also etwa eine Methode -parser:foundNodeWithPropertys:. Dann kannst du dir sogar das +alloc -init unde n ganzenKlassenkram sparen. (Ohne deinen Code insgesamt durchgeschaut zu haben.)
    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"?
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Sein Assert machte in seiner bisherigen Implementierung absolut Sinn. Es löst nur nicht sein Problem. Es dient etwas ganz anderem, wie man an den zahlreichen anderen Asserts sehen kann. Und wie man wissen kann, wenn man weiß, wozu Asserts da sind.


    NEIN, dieses assert macht keinen sinn. hier nochmal für dich zum draus-schlau-werden:

    Quellcode

    1. assert([known isKindOfClass:[known class]]);


    und komm mir nicht damit dass er mit dem konstrukt auf "known != nil" testen will!

    Doch es macht in seiner bisherigen Implementierung Sinn. Er hat es nämlich bisher nur für eine Klasse implementiert. Und da Arrays ihre Elemente auf id typisieren, will er damit testen, dass es sich um Instanzen der richtigen Klasse handelt. Er zitiert seinen bisherigen Code.

    +++

    Ach, du meintest, dass der Assert, wie er ihn geschrieben hat, keinen Sinn ergibt? Also das war gar nicht auf das Thema bezogen?

    Das stimmt natürlich.


    eben, denn [known isKindOfClass:[known class]] wird immer YES sein, außer "known" ist nil.
  • gritsch schrieb:

    uniique schrieb:

    das hatte ich aber in einem Post von mir dann korrigiert, weil wie du schon schreibst, es wird immer YES sein weil known immer known class ist :)


    ja aber amin wollt es nicht glauben/verstehen ;)

    Nein, ich hatte den Fehler begangen anzunehmen, dass dein Beitrag irgendwas mit dem Thema zu tun hat.
    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"?
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    uniique schrieb:

    das hatte ich aber in einem Post von mir dann korrigiert, weil wie du schon schreibst, es wird immer YES sein weil known immer known class ist :)


    ja aber amin wollt es nicht glauben/verstehen ;)

    Nein, ich hatte den Fehler begangen anzunehmen, dass dein Beitrag irgendwas mit dem Thema zu tun hat.


    ich hab nach dem sinn gefragt. bezüglich dem thread hab ich nachher ja das mit der uniqueId geschrieben.