[KVC翻译]1-Key-Value Coding Programming Guide 官方文档第一部分

Key-Value Coding Programming Guide 官方文档第一部分
2018.9.20 第一次修正

iOS-KVC官方文档第一部分

Key-Value Coding Programming Guide - Getting Started

键值编码编程指南-入门

该文档苹果官方已不再更新。有关Apple SDK的最新信息,请访问文档网站

关于键值编码

补充: key-value coding 翻译为 键值编码 , 简称KVC.

键值编码是一种由NSKeyValueCoding非正式协议启用的机制,对象采用该机制提供对其属性的间接访问。当对象符合键值编码时,其属性可通过字符串参数通过简洁,统一的消息传递接口寻址。这种间接访问机制补充了实例变量及其相关访问​​器方法提供的直接访问。

您通常使用访问器方法来访问对象的属性。get访问器(或getter)返回属性的值。set访问器(或setter)设置属性的值。在Objective-C中,您还可以直接访问属性的基础实例变量。以任何这些方式访问对象属性都很简单,但需要调用特定于属性的方法或变量名称。随着属性列表的增长或变化,访问这些属性的代码也必须如此。相反,符合键值编码的对象提供了一个简单的消息传递接口,该接口在其所有属性中都是一致的。

键值编码是一个基本概念,是许多其他Cocoa技术的基础,例如键值观察(key-value observing),Cocoa绑定(Cocoa bindings),Core Data和AppleScript-ability。在某些情况下,键值编码还有助于简化代码。

使用键值编码兼容对象

对象通常在NSObject(直接或间接)继承时采用键值编码,它们都采用NSKeyValueCoding协议并为基本方法提供默认实现。这样的对象通过紧凑的消息传递接口使其他对象能够执行以下操作:

  • 访问对象属性。该协议指定方法,例如getter valueForKey: 和setter setValue:forKey:,用于通过名称或键访问对象属性,参数为字符串。这些和相关方法的默认实现使用键来定位基础数据并与其交互,如Accessing Object Properties

  • 操纵集合属性。访问方法的默认实现和对象的集合属性(如NSArray对象)一样,也和任何其他属性一样。此外,如果对象定义属性的集合访问器方法,则它允许对集合内容进行键值访问。这通常比直接访问更有效,并允许您通过标准化界面使用自定义集合对象,如Accessing Collection Properties

  • 在集合对象上调用集合运算符。在符合键值编码的对象中访问集合属性时,可以将集合运算符插入到键字符串中,如Using Collection Operators。集合运算符根据默认的NSKeyValueCodinggetter实现对集合执行操作,然后返回集合的新的过滤版本或表示集合的某些特征的单个值。

  • 访问非对象属性。协议默认实现检测非对象属性,包括标量和结构体,并自动将它们包装和解包为协议接口上使用的对象,如Representing Non-Object Values。此外,该协议声明了一种方法,该方法允许兼容对象nil通过键值编码接口在非对象属性上设置值时为该情况提供合适的作用。

  • key path访问属性。如果具有符合键值编码的对象层次结构,则可以使用基于key path的方法调用,使用单个调用在层次结构内深入查看,获取或设置值。

采用对象的键值编码

为了使您自己的对象键值编码符合要求,您需要确保它们采用NSKeyValueCoding非正式协议并实现相应的方法,例如作为valueForKey: 通用getter和setValue:forKey: 通用setter。幸运的是,如上所述,NSObject 采用此协议并为这些和其他基本方法提供默认实现。因此,如果您从NSObject(或其许多子类中的任何一个)派生对象,那么大部分工作已经完成。

为了使默认方法完成其工作,您需要确保对象的访问器方法和实例变量遵循某些明确定义的模式。这允许默认实现找到对象的属性以响应键值编码消息。然后,您可以选择通过提供验证方法和处理某些特殊情况来扩展和自定义键值编码。

使用Swift进行键值编码

NSObject从其子类或其子类之一 继承的Swift对象默认情况下是符合其属性的键值编码。而在Objective-C中,属性的访问器和实例变量必须遵循某些模式,Swift中的标准属性声明会自动保证这一点。另一方面,协议的许多功能要么不相关,要么使用Objective-C中不存在的本机Swift构造或技术来更好地处理。例如,因为所有Swift属性都是对象,所以您永远不会使用默认实现对非对象属性的特殊处理。

因此,虽然键值编码协议方法直接转换为Swift,但本指南主要关注Objective-C,您需要做更多工作以确保合规性,以及键值编码通常最有用的地方。整个指南中都提到了需要在Swift中采用明显不同方法的情况。

有关使用Swift和Cocoa技术的更多信息,请阅读将Swift与Cocoa和Objective-C一起使用(Swift 3)。有关Swift的完整描述,请阅读Swift编程语言(Swift 3)

使用键值编码的其他Cocoa技术

符合键值编码的对象可以参与依赖于此类访问的各种Cocoa技术,包括:

  • 键值观察(Key-value observing)。此机制使对象能够注册异步通知监听另一个对象属性的改变,如“ Key-Value Observing Programming

  • Cocoa绑定(Cocoa bindings)。这一系列技术完全实现了Model-View-Controller范例,其中模型(Model)用于封装应用程序数据,视图(View)用于显示和编辑数据,控制器(Controller)在两者之​​间进行调解。阅读Cocoa Bindings Programming Topics以了解有关Cocoa绑定的更多信息。

  • 核心数据(Core Data)。该框架为与对象生命周期和对象图形化管理相关的常见任务(包括持久性)提供通用和自动化解决方案。您可以在Core Data Programming Guide阅读Core Data 。

  • AppleScript。这种脚本语言可以直接控制脚本化应用程序和macOS的许多部分。Cocoa的脚本支持利用键值编码来获取和设置脚本化对象中的信息。NSScriptKeyValueCoding非正式协议中的方法提供了使用键值编码的附加功能,包括通过多值键中的索引获取和设置键值,以及将键值强制(或转换)为适当的数据类型。AppleScript Overview提供了AppleScript及其相关技术的高级概述。

由于笔者水平有限,文中如果有错误的地方,或者有更好的方法,还望大神指出。
附上本文的所有 demo 下载链接,【GitHub】
如果你看完后觉得对你有所帮助,还望在 GitHub 上点个 star。赠人玫瑰,手有余香。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容