Apple的关键价值编码 - 有人可以向C#开发人员解释为什么我需要这个以及它做什么?

Kru*_*lur 7 .net c# objective-c xamarin.ios kvc

在我通过Monotouch切换到iOS开发之前,我使用ObjectiveC玩了一下.从那时起,我就开始关注"键值编码"(KVC).我从来没有理解它有什么好处,它背后的魔力是什么.

根据我的理解,它只是一个名称和值的集合,比如.NET NameValueCollection:而不是设置anObject.Address = "An address Value"你会写anObject.Properties["Address"] = "An address value".大.所以呢?因为这对我来说太容易了,我敢肯定不可能.

或者是因为.NET具有反射,因此不需要像键值编码那样的东西?我可以获取" anObject" 的类型并使用反射来循环其所有属性并查找名为"Address"的那个,然后使用反射来设置值.这可能是KVC的类比吗?

我希望有人在ObjC和C#/ .NET中担任专业人员,他可以向我解释一下它带来的好处以及它将如何转化为.NET.请不要只指向Apple的文档.我知道这一切.我试图通过不了解KVC来查明我的编码生活中是否遗漏了某些东西?或者我是否可能在.NET中使用类似的东西而不知道如果我使用ObjC它会转换为KVC?

Edu*_*coz 11

从现在大概3年使用这两者的人来看:

正如你所知,在KVC中没有任何令人惊奇的复杂功能,无法用C#中的字典和NameValueCollections来完成.

最大的区别是KVC是用语言构建的.在OBJ - C的一个目的IS一个NameValueCollection中.您不必改变开发方式(从类和属性到字典)来使用它.您可以使用所需的属性创建对象,然后稍后调用valueForKey:@"name",一切仍然有效.

现在你可以说:"是的很酷,但我可以用反射来做到这一点!".当然你可以,但就像以前一样,你将不得不改变你再次发展的方式,而不是计算一般反射慢得多的事实.

KVC的另一个很酷的功能是它允许你使用KVO,它基本上允许你注册接收有关任何对象变化的通知,而不必在这些对象中编写单行代码.因此,在应用程序的任何对象中,您可以调用"addObserver:forKeyPath:",并在应用程序中的任何其他人更改该属性时接收回调.这对于iOS应用等实时应用非常有用.

同样,您可以在C#中实现KVO(例如MVVM框架一直这样做),但您必须为此编写额外的代码.在Obj-C中,它是用语言构建的.


mig*_*aza 7

我在MonoMac的背景下写了这篇博文,MonoMac是MonoTouch的同行项目,但用于构建Mac应用程序:

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

键值编码是一组允许应用程序使用字符串访问对象属性的实践.这类似于Silverlight中的Binding Expressions.在这两种情况下,目的是允许不能直接访问本机代码的工具访问程序中的属性.

特别是,这很有用,因为有些API可以利用这一点.例如,CoreAnimation可以根据对象的"路径"为属性设置动画.例如,你可以这样做:

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

在这种情况下,"position.x"引用图层的位置,在该位置内它是X组件.

上面的博客文章详细介绍了如何实际公开自己的对象以参与此协议(注册您自己的属性以使其对Key-Value-Coding系统可见).

另一位MonoMac开发人员Kenneth在此广泛发表了博文:

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

特别是他处理与Reflection的相似之处,他向您展示了如何使用[Export]将C#代码转换为符合KVC的代码.