Struct error

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

  • Oh, noch eine Errungenschaft, die wir wohl Swift zu verdanken haben und die das Coden einfacher macht – dabei aber billigend in Kauf nimmt Falschaussagen zu liefern: Protokolle.

    Gegeben sei folgendes Protokoll:

    Quellcode

    1. @protocol FooBarProtocol <NSObject>
    2. - (NSString * ) foo;
    3. - (void )bar;
    4. @end


    Gegeben seien weiterhin drei Testklassen. Eine implementiert das Protokoll gemäß Header, eine liefert die Methoden im Header und implementiert sie, eine implementiert die Methoden für sich allein ohne im Header darauf hinzuweisen.

    Weiterhin gegeben sei folgender Testcode:

    Quellcode

    1. int main(int argc, const char * argv[]) {
    2. @autoreleasepool {
    3. // Instantiate All Of Them
    4. FooBar * fb = [FooBar new];
    5. FooBarNonCompliant * fbnc = [FooBarNonCompliant new];
    6. FooBarConforms * fbc = [FooBarConforms new];
    7. // Now Check For Response To Selector For Each Method From Protocol
    8. if( [fbc respondsToSelector:@selector(foo)] && [fbc respondsToSelector:@selector(bar)] ) {
    9. NSLog( @"FooBarConforms responds to both -foo and -bar" );
    10. }
    11. if( [fbnc respondsToSelector:@selector(foo)] && [fbc respondsToSelector:@selector(bar)] ) {
    12. NSLog( @"FooBarNonCompliant responds to both -foo and -bar" );
    13. }
    14. if( [fb respondsToSelector:@selector(foo)] && [fbc respondsToSelector:@selector(bar)] ) {
    15. NSLog( @"FooBar responds to both -foo and -bar" );
    16. }
    17. // Check For Protocol Conformaty
    18. if( [fbc conformsToProtocol:@protocol(FooBarProtocol)] ) {
    19. NSLog( @"As I thougt FooBarConforms conforms to protocol" );
    20. }
    21. else {
    22. NSLog( @"FooBarConforms doesn't conform to protocol? What have I done?" );
    23. }
    24. if( [fbnc conformsToProtocol:@protocol(FooBarProtocol)] ) {
    25. NSLog( @"FooBarNonCompliant conforms to protocol? Kewl!" );
    26. }
    27. else {
    28. NSLog( @"As I thougt FooBarNonCompliant doesn't conform to protocol." );
    29. }
    30. if( [fb conformsToProtocol:@protocol(FooBarProtocol)] ) {
    31. NSLog( @"FooBar conforms to protocol. Great!" );
    32. }
    33. else {
    34. NSLog( @"FooBar doesn't conform to protocol. But it should!" );
    35. }
    36. }
    37. return 0;
    38. }
    Alles anzeigen


    Das Resultat spricht für sich:
    FooBarConforms responds to both -foo and -bar
    FooBarNonCompliant responds to both -foo and -bar
    FooBar responds to both -foo and -bar

    As I thougt FooBarConforms conforms to protocol
    As I thougt FooBarNonCompliant doesn't conform to protocol.
    FooBar doesn't conform to protocol. But it should!


    [NSObject -conformsToProtocol:] testet also entgegen aller Annahmen nicht, ob das Objekt das Protokoll implementiert (a.k.a. im Protokoll definierte Methoden nach außen sichtbar implementiert), sondern ob die Klasse angibt das Protokoll zu implementieren.

    Sagt ja auch die Dokumentation.
    A class is said to “conform to” a protocol if it adopts the protocol or inherits from another class that adopts it.
    Protocols are adopted by listing them within angle brackets after the interface declaration.

    Klassenorientierter Bullshit.
    «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
  • t-no schrieb:

    Amin Negm-Awad schrieb:

    Es ist die einfach: "Ich habe Ahnung, wovon ich rede"-Phase. Solltest du vielleicht mal eintreten.

    Scheint ja ein ganz lustiger Zustand zu sein, trotzdem glaube ich nicht, dass ich persönlich Spaß daran hätte - aber wer Freude an langatmigen Diskussionen hat, findet so vielleicht sein Glück.

    "Initialisieren mittels JSON-Strings" war von mir eigentlich eher als Scherz gemeint - um was anderes scheint es in den verlinkten Beiträgen ja leider nicht zu gehen (da aber wohl immerhin mit Daten, die von sich aus in JSON-Form vorliegen).
    Solange nicht einmal die vermeintlich einfache Aufgabe mit dem äquivalenten Code gelöst wird, halte ich Debatten eh für unsinnig (mit Swift braucht man übrigens keine zwei Minuten).
    Es ging in meinem Beispiel um nichts anderes als einen generischen Initialisierer aus Cocoa-Basisklassen. (Die in JSON abgebildet sind.) Einfach noch einmal zurückschollen.

    Im Übrigen ist es natürlich immer möglich, Blödsinn als Scherz abzutun.
    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"?
  • t-no schrieb:

    Vor kurzem ist die "Herausforderung" übrigens etwas weniger nervig geworden: Für Objective-C gibt es jetzt "nonnull" (ob es für normale Variablen auch wieder eine stylische Variation mit Unterstrich-Prefix gibt, habe ich noch nicht gesehen.
    Mal nachgezählt:
    "?" -> 1 Buchstabe
    "nonnull" -> 7
    (ohne weiteren Kommentar)

    Falls die Swift-Hasser diese Neuerung jetzt auch verteufeln, kann ich sogar mal ein bisschen Verständnis für sie aufbringen - in dem Fall hätte Swift ja tatsächlich dafür gesorgt, dass Objective-C "leidet" (ansonsten kann ich mich generell nur über das Geschimpfe wundern - es ist ja nicht so, dass Objective-C absolut schlechter wird, nur weil Apple eine neue Sprache entwickelt hat).
    Objective-C leidet darunter vor allem deshalb, weil dieses überflüssige Konstrukt nur für Swift eingebaut wurde. Es stammt also nicht von Swift, sondern ist für Swift.

    Ja, derlei Dinge sind zunehmend zu befürchten.
    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:

    Marco Feltmann schrieb:

    Das ist nur halb richtig. Im Fall der 'nonnull' Annotation prüft nämlich der Compiler, ob das zur Compilezeit übergebene Objekt nil ist und verweigert dann den Compiliervorgang mit einem Fehler.


    nur das kann er gar nicht wissen zum compilezeitpunkt.

    Quellcode

    1. id tmpObject = [myArray firstObject]; // ist das nun nil oder nicht ;-)
    2. [SomeClassOrObject someMethodWithNonnullParameter:tmpObject]; // is this ok or not? ;-)
    Doch, das kann er eben wissen, wenn an -firstObject anmontiert ist, dass es nie nil liefert.

    Dieses ganze Optional-Jedresse funktioniert ja deshalb, weil es die ganze Sprache vermüllt. Man muss das immer einhalten. Dann ist es aber nervtötend. Übrigens kommen dann beim Durchhalten mehr Zeichen heraus als 7, weil man es eben sogar an seine Großmutter anmontieren muss.
    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"?