NSArrayController selection in Swift

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

  • NSArrayController selection in Swift

    Folgende Gegebenheit:
    Eine Tabelle zeigt eine Liste von Namen (NSTableView) an (Kontaktdaten werden über CoreData gespeichert). Wenn ich auf einen Namen klicke, möchte ich die Adresse haben, um sie weiterverwenden zu können.

    Unter Objectiv-C habe ich die Adresse einfach und ohne Probleme bekommen.
    NSString *adresseString = [[myContentArray selection] valueForKey:@"adresse"];

    In Swift funktioniert es einfach nicht:
    let adresseString: String = QuickAccessArrayController.selection().value(forKey: "adresse")

    Fehler:
    Bildschirmfoto 2019-01-09 um 12.13.32.png


    Wo hakt es hier?
  • Ich kämpfe ja immer noch mit Swift, da viele Dinge bei Swift nicht wirklich logisch für mich sind.

    Ich würde jetzt mal tippen, dass der Compiler nicht erkennt, das selection() ein Objekt vom Typ NSManagedObject liefert und daher nix mit der Methode value(forKey:) anfangen kann.

    Es sollte funktionieren, wenn Du den kompletten Befehl splittest und value(forKey:) explizit auf eine Variable vom Typ NSManagedObject verwendest. Alternativ könntest Du es auch mal mit Casting des Ergebnisse von selection() probieren, wobei ich bei der korrekten Syntax leider nicht behilflich sein kann.

    Evtl. haben die Swift Entwickler aber auch eine einfachere Lösung parat.
  • Scotch schrieb:

    Unter Objectiv-C habe ich die Adresse einfach und ohne Probleme bekommen.

    Quellcode

    1. NSString *adresseString = [[myContentArray selection] valueForKey:@"adresse"];
    Hmm, hier schickst du einer Instanz die Nachricht „selection“.

    Scotch schrieb:

    In Swift funktioniert es einfach nicht:

    Quellcode

    1. let adresseString: String = QuickAccessArrayController.selection().value(forKey: "adresse")
    Das hier sieht danach aus, als würdest du von der Klasse „QuickAccessArrayController“ die Methode „selection()“ aufrufen. Sollte das jedoch auch eine Instanz sein, versuch es mal ohne die Klammern, also so:

    Quellcode

    1. let adresseString: String = QuickAccessArrayController.selection.value(forKey: "adresse")
  • Na ja, selection ist ein Property der Klasse NSArrayController bzw. der Superklasse NSObjectController.

    Da als Rückgabewert für selection in Swift Any definiert ist, habe ich halt vermutet, dass der Compiler dann die Methode value(forKey:) nicht (er)kennt und daher meckert.

    Ah, ich sollte mir das gepostet Bild vielleicht mal komplett anzeigen lassen. Das Problem ist das Property selection und nicht die Methode value(forKey:). Da selection ein Propery und keine Methode ist, sind die Klammern, wie von Michael angemerkt, natürlich überflüssig bzw. führen zu dem angezeigten Fehler.

    Also einfach die von Michael gepostet Lösung verwenden. Ich fragt mich jedoch trotzdem, wie der Compiler die Methode value(forKey:) (er)kennt, wenn der Rückgabewert von selection vom Typ Any ist?

    Ich hätte da jetzt etwas wie

    Quellcode

    1. let adresseString: String = QuickAccessArrayController.selection as NSManagedObject?.value(forKey: "adresse")
    erwartet, damit der Compiler dies korrekt übersetzen kann.