Bevor ich mit Monotouch zur iOS-Entwicklung wechselte, spielte ich ein bisschen mit ObjectiveC. Seit einer Sache beschäftigt mich "Key Value Coding" (KVC) . Ich habe nie verstanden, wofür es gut ist und was dahinter steckt.
Für mein Verständnis ist es nur eine Sammlung von Namen und Werten, wie .NET NameValueCollection
: Anstatt anObject.Address = "An address Value"
zu setzen, würdest du anObject.Properties["Address"] = "An address value"
schreiben.
Groß. Na und? Weil mir das zu einfach erscheint, bin ich mir sicher, dass das nicht sein kann.
Oder liegt es daran, dass .NET Reflektion hat und daher keine Schlüssel-Wert-Codierung benötigt? Ich kann den Typ von " anObject
" nehmen und Reflektion verwenden, um alle seine Eigenschaften zu durchlaufen und nach dem einen zu suchen, der "Adresse" genannt wird und dann Reflektion verwendet, um den Wert festzulegen.
Ist das vielleicht die Analogie von KVC?
Ich hoffe, es gibt jemanden da draußen, der ein Profi in ObjC und C # /. NET ist, der mir erklären kann, was die Vorteile sind und wie es in .NET übersetzt werden würde. Bitte verweisen Sie mich nicht nur auf die Dokumentation von Apple. Ich weiß das alles. Ich versuche herauszufinden, ob etwas in meinem Coding-Leben bisher gefehlt hat, weil ich KVC nicht kannte. Oder habe ich vielleicht etwas Ähnliches in .NET verwendet, mir nicht bewusst, dass es in KVC übersetzen würde, wenn ich ObjC verwenden würde?
Von jemandem, der jetzt jeden Tag für wahrscheinlich 3 Jahre benutzt:
Wie Sie herausgefunden haben, gibt es in KVC nichts Unglaublich Komplexes, was mit Dictionaries und NameValueCollections in C # nicht möglich ist.
Der große Unterschied ist, dass KVC in der Sprache aufgebaut ist. Ein Objekt in Obj-C IS ist eine NameValueCollection. Sie müssen die Art der Entwicklung (von Klassen und Eigenschaften zu Wörterbüchern) nicht ändern, um sie zu verwenden. Sie können Ihr Objekt mit den gewünschten Eigenschaften erstellen und später einen valueForKey aufrufen: @ "name", und alles funktioniert noch.
Jetzt können Sie sagen: "Ja cool, aber ich kann das mit Reflektion machen!". Sicher kannst du das, aber genauso wie zuvor musst du die Art und Weise, wie du dich wieder entwickelst, ändern, abgesehen davon, dass die Reflexion im Allgemeinen viel langsamer ist.
Ein weiteres cooles Feature von KVC ist die Verwendung von KVO, mit dem Sie sich grundsätzlich registrieren können, um Benachrichtigungen über Änderungen in einem Objekt zu erhalten, ohne eine einzige Codezeile in diese Objekte schreiben zu müssen. In jedem Objekt Ihrer Anwendung können Sie also "addObserver: forKeyPath:" aufrufen und einen Rückruf erhalten, wenn jemand anderes in Ihrer Anwendung diese Eigenschaft ändert. Dies ist besonders nützlich für Live-Apps wie iOS-Apps.
Auch hier können Sie KVO in C # implementieren (MVVM-Frameworks zum Beispiel tun dies die ganze Zeit), aber Sie müssen extra Code dafür schreiben. In Obj-C ist es in der Sprache gebaut.
Ich habe darüber im Zusammenhang mit MonoMac gebloggt, dem Peer-Projekt für MonoTouch, das aber zum Erstellen von Mac-Anwendungen verwendet wurde:
Schlüsselwertcodierung ist eine Sammlung von Methoden, mit denen Anwendungen mithilfe von Zeichenfolgen auf Objekteigenschaften zugreifen können. Dies ist vergleichbar mit Binding Expressions in Silverlight. In beiden Fällen besteht der Zweck darin, Tools zu ermöglichen, die nicht direkt auf Ihren systemeigenen Code zugreifen können, um auf Eigenschaften Ihres Programms zuzugreifen.
Dies ist insbesondere nützlich, da einige APIs davon profitieren können. Zum Beispiel kann CoreAnimation Eigenschaften mit ihrem "Pfad" zum Objekt animieren. Zum Beispiel können Sie Folgendes tun:
%Vor%Die "position.x" verweist in diesem Fall auf die Position der Ebene und innerhalb dieser Position ist es eine X-Komponente.
Der obige Blogpost geht ausführlicher darauf ein, wie Sie Ihre eigenen Objekte für die Teilnahme an diesem Protokoll verfügbar machen können (indem Sie Ihre eigenen Eigenschaften registrieren, um sie für das Schlüsselwertcodiersystem sichtbar zu machen).
Kenneth, ein anderer MonoMac-Entwickler hat hier ausführlich darüber gebloggt:
Er behandelt insbesondere die Ähnlichkeiten mit Reflection und zeigt Ihnen, wie Sie mit [Export] Ihren C # -Code in KVC-konformen Code umwandeln können.
Wenn Sie auf eine Eigenschaft wie diese zugreifen
%Vor% Der Code wird sehr "statisch" sein. Es wird immer auf Address
Sie können einen dynamischeren Code wie diesen erstellen
%Vor%Sie würden dies tun, wenn Sie zur Kompilierzeit nicht wissen, auf welche Eigenschaft zugegriffen wird.
In c # würden Sie normalerweise ein Dictionary<TKey,TValue>
zum Speichern von Schlüssel / Wert-Paaren verwenden. Der automatische Zugriff auf Eigenschaften über KVC wie in Objective-C wird in c # nicht unterstützt. Sie würden die Eigenschaft entweder als
und instanziieren Sie es im Klassenkonstruktor mit
%Vor%Dann könntest du so darauf zugreifen
%Vor% Oder Sie müssten Reflection
verwenden, um auf die Eigenschaft
Dies ist jedoch nicht sehr effizient.
Tags und Links .net c# objective-c xamarin.ios kvc