什么是KVC?(What Is Key-Value Coding?)

来源:互联网 发布:树莓派centos扩展sd卡 编辑:程序博客网 时间:2024/05/29 15:58

什么是KVC?

KVC是一种间接访问对象属性的机制,使用字符串识别属性,而不是通过调用一个访问器方法或直接访问实例变量。在本质上,KVC定义了你的应用实现的访问器方法的模式和方法签名。

访问器方法,顾名思义,提供访问你应用程序数据模型的属性值的方法。有两种基本形式的访问器——get访问器和set访问器。Get 访问器,也称为getters,返回一个属性值。Set 访问器,也称为setters,设置属性值。有getter和setter来处理对象属性和许多关系。

在应用中实现KVC兼容的访问是一个重要的设计原则。访问器帮助执行适当的数据封装并促进与其他技术的集成例如KVO,Core Data,Cocoa绑定和脚本。KVC方法在许多情况下,也被用来简化应用代码。

KVC的基本方法在NSKeyValueCoding 中声明,是Objective-C的非正式协议,NSObject 提供默认实现。

KVC支持对象值属性以及标量类型和结构。非对象参数和返回类型会检测、自动装包、拆包,见标量和结构帮助( Scalar and Structure Support)中描述。

KVC和脚本

Cocoa中支持的脚本使应用可以很容易利用脚本访问它的模型对象,该对象封装了应用的数据。当用户执行AppleScript命令,该命令的目标是直接跳转到应用模型对象来完成工作。

OS X中的脚本在很大程度上依赖于KVC来支持AppleScript命令的执行。在编写脚本应用,一个模型对象定义了支持的一组key。每个key代表对象的一个属性。脚本相关的key有文字、字体、文件和颜色。KVC API提供了一种通用和自动的方式来查询对象key对应的值,并为这些key设置新值。

当你设计应用的对象,你应该为你的模型对象定义一组key,并实现相关的访问器方法。当你定义应用的脚本时,你可以指定这些key支持的脚本类。如果你支持KVC,你会“免费”获得很多脚本的支持。

在AppleScript中,对象层级定义应用中模型对象的结构。大多数AppleScript命令指定应用中一个或多个对象,通过深入到这个对象的层级结构从父容器中获取子元素。你可以适用KVC在类描述中定义属性之间的关系。详情参见描述属性关系( Describing PropertyRelationships)。

Cocoa脚本支持利用KVC获取和设置脚本对象的信息。Objective-C非正式协议NSScriptKeyValueCoding 提供了KVC额外功能,包括通过多值key的index获取和设置键值并转换键值到一个合适的数据类型。

使用KVC简化代码

你可以在自己的代码中使用KVC方法。例如,在OS X NSTableView 和NSOutlineView对象都关联每个列的标示符字符串。通过标示符标示你希望显示的关键属性,你可以极大的简化你的代码

列表1中展示了NSTableView 代理方法不使用KVC的实现。列表2中展示了使用KVC返回相应值,使用列标示符作为key

列表1 不使用KVC实现数据源方法

- (id)tableView:(NSTableView *)tableview      objectValueForTableColumn:(id)column row:(NSInteger)row {     ChildObject *child = [childrenArray objectAtIndex:row];    if ([[column identifier] isEqualToString:@"name"]) {        return [child name];    }    if ([[column identifier] isEqualToString:@"age"]) {        return [child age];    }    if ([[column identifier] isEqualToString:@"favoriteColor"]) {        return [child favoriteColor];    }    // And so on.}


列表2 使用KVC实现数据源方法

- (id)tableView:(NSTableView *)tableview      objectValueForTableColumn:(id)column row:(NSInteger)row {     ChildObject *child = [childrenArray objectAtIndex:row];    return [child valueForKey:[column identifier]];}

 

官方原文地址:

https://developer.apple.com/library/prerelease/tvos/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/Overview.html#//apple_ref/doc/uid/20001838-SW1


0 0