2012-02-25 13 views
7

Zanim przełączyłem się na programowanie na iOS za pośrednictwem Monotouch, grałem trochę z ObjectiveC. Odkąd jedna myśl była na mojej głowie, "Kodowanie wartości klucza" (KVC). Nigdy nie zrozumiałem, na czym to polega i czym jest magia.Kodowanie wartości klucza Apple - czy ktoś może wyjaśnić programistom C#, dlaczego potrzebuję tego i co robi?

Dla mojego zrozumienia jest to tylko zbiór nazw i wartości, takich jak .NET's NameValueCollection: Zamiast ustawienia anObject.Address = "An address Value" napisałbyś anObject.Properties["Address"] = "An address value". Świetnie. Więc co? Ponieważ wydaje mi się to zbyt łatwe, jestem pewien, że to niemożliwe.

A może dlatego, że .NET ma odbicie i dlatego nie potrzebuje czegoś takiego jak kodowanie wartości kluczowej? Mogę pobrać typ "anObject" i użyć odbicia, aby zapętlić wszystkie jego właściwości i wyszukać ten o nazwie "Adres", a następnie użyć odbicia, aby ustawić wartość. Czy to może być analogia KVC?

Mam nadzieję, że jest ktoś, kto jest profesjonalistą w ObjC i C#/.NET, który może mi wyjaśnić jakie są korzyści i jak to przełoży na .NET. Proszę nie kierować mnie tylko do dokumentacji Apple. Wiem o tym wszystkim. Próbuję dowiedzieć się, czy czegoś brakuje w moim dotychczasowym życiu kodowania, nie znając KVC? A może używałem czegoś podobnego w .NET, nie będąc świadomym, że przełożyłoby się to na KVC, gdybym używał ObjC?

+1

Jeśli komuś, kto ma pojęcia na temat C#/.NET, jest dozwolony komentarz - naprawdę użytecznym aspektem KVC jest to, że pozwala on na istnienie KVO (Key-Value Observing). – Monolo

Odpowiedz

11

od kogoś, kto używa zarówno na co dzień dla prawdopodobnie 3 lat:

Gdy zorientowali się, nie ma nic niezwykle skomplikowane w KVC, które nie mogą być wykonane ze słowników i NameValueCollections w C#.

Główna różnica polega na tym, że KVC jest zbudowany w tym języku.Obiekt w Obj-C IS a NameValueCollection. Nie musisz zmieniać sposobu, w jaki się rozwijasz (od klas i właściwości do słowników), aby z niego korzystać. Możesz utworzyć obiekt z właściwościami, które chcesz, a następnie zadzwonić do valueForKey: @ "name", a wszystko nadal działa.

Teraz możesz powiedzieć: "tak, super, ale mogę to zrobić z refleksją!". Oczywiście, że możesz, ale tak jak poprzednio, będziesz musiał zmienić sposób, w jaki się rozwijasz, nie licząc faktu, że odbicie jest ogólnie wolniejsze.

Kolejna fajna funkcja KVC pozwala na korzystanie z KVO, które w zasadzie pozwala na rejestrację, aby otrzymywać powiadomienia o zmianach w dowolnym obiekcie bez konieczności pisania pojedynczego wiersza kodu w tych obiektach. Tak więc w dowolnym obiekcie w aplikacji można wywołać "addObserver: forKeyPath:" i odebrać wywołanie zwrotne, jeśli ktokolwiek inny w aplikacji zmieni tę właściwość. Jest to bardzo przydatne w przypadku aplikacji na żywo, takich jak aplikacje na iOS.

Ponownie, możesz zaimplementować KVO w C# (na przykład w frameworkach MVVM), ale musisz napisać dodatkowy kod. W Obj-C jest zbudowany w języku.

+1

Sądzę, że kluczowe ścieżki i funkcje zagregowane mogą być wymienione jako kolejna ważna cecha KVC? Ogólna wygoda dodaje różnicę w interfejsach API; w języku C# akceptowanie obiektu i nazwy właściwości String nie byłoby w wielu przypadkach pierwszym wyborem, ale w Obj-C przyjęcie identyfikatora i parametru keyPath jest dość standardowe i normalne. –

+0

@AndreyTarantsov tak, całkowicie zgadzam się na kwestię keypath (wraz z selektorami). Jest to kolejna z tych rzeczy, które można wykonać w języku C#, ale po prostu pobierają dużo dodatkowego kodu, aby nikt tego nie zrobił. –

4

Jeżeli dostęp do właściwości jak ten

anObject.Address = "An address Value" 

Kod będzie bardzo „statyczne”. To zawsze dostęp Address

Można tworzyć bardziej dynamiczny kod jak ten

void SetProperty (string propertyName, string value) 
{ 
    anObject.Properties[propertyName] = value; 
} 

Można by to zrobić, jeśli nie wiesz, w czasie kompilacji, które będą mieć dostęp nieruchomość.

W języku C# zazwyczaj używa się Dictionary<TKey,TValue> do przechowywania par klucz/wartość. Automatyczny dostęp do właściwości za pośrednictwem KVC jak w Objective-C nie jest obsługiwany w języku C#. Można by też zadeklarować właściwość jako

public Dictionary<string,string> Properties { get; private set; } 

i oznacz ją w konstruktorze klasy z

Properties = new Dictionary<string,string>(); 

następnie można uzyskać do niego dostęp jak ten

anObject.Properties[propertyName] = value; 

Albo trzeba by użyć Reflection aby uzyskać dostęp do nieruchomości:

Type type = anObject.GetType(); 
// Or Type type = typeof(TypeOfAnObject); 
PropertyInfo prop = type.GetProperty(propertyName); 
prop.SetValue(anObject, propertyValue, null); 

Jednak nie jest to bardzo wydajne.

+0

Dostęp do stylu tablicy jest analogiczny do indeksu w języku C#. – pickypg

7

I napisał o tym w kontekście Monoman, projekt peer to MonoTouch ale wykorzystywane do tworzenia aplikacji Mac:

http://tirania.org/monomac/archive/2010/Dec-07.html

Key-Value Coding jest zbiorem praktyk, które pozwalają aplikacjom do uzyskiwać dostęp do właściwości obiektu za pomocą łańcuchów. Jest to podobne do Wyrażeń wiążących w Silverlight. W obu przypadkach celem jest umożliwienie tworzenia narzędzi, które nie mają bezpośredniego dostępu do Twojego natywnego kodu w celu uzyskania dostępu do właściwości z twojego programu.

Jest to szczególnie użyteczne, ponieważ niektóre interfejsy API mogą z tego korzystać. Na przykład CoreAnimation może animować właściwości, podając ich "ścieżkę" do obiektu. Na przykład, można zrobić:

var animateX = CAKeyFrameAnimation.FromKeyPath ("position.x"); 
pos.Values = new NSNumber [] { 0, 10, 60 }; 
layer.AddAnimation (animateX, "move"); 

W „position.x” w tym przypadku odwołuje pozycję warstwy, a w ramach tej pozycji, to X komponent.

W powyższym wpisie na blogu znajduje się więcej informacji o tym, w jaki sposób można rzeczywiście wystawiać własne obiekty do udziału w tym protokole (rejestrowanie własnych właściwości, aby były widoczne dla systemu kodowania wartości klucza).

Kenneth, drugi z twórców Monoman blogu o tym obszernie tutaj:

http://cocoa-mono.org/archives/153/kvc-kvo-and-cocoa-bindings-oh-my-part-1/

W szczególności zajmuje się podobieństw z refleksji, a on pokazuje, jak używać [Export], aby włączyć C# Kod również do kodu zgodnego z KVC.

+1

+1 dla linku, który porównuje KVC do refleksji! – Krumelur

Powiązane problemy