Key-Value Coding Programming Guide 官方文件第一部分
2018.9.20 第一次修正
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:
和settersetValue:forKey:
,用於通過名稱或鍵訪問物件屬性,引數為字串。這些和相關方法的預設實現使用鍵來定位基礎資料並與其互動,如Accessing Object Properties。 -
操縱集合屬性。 訪問方法的預設實現和物件的集合屬性(如
NSArray
物件)一樣,也和任何其他屬性一樣。此外,如果物件定義屬性的集合訪問器方法,則它允許對集合內容進行鍵值訪問。這通常比直接訪問更有效,並允許您通過標準化介面使用自定義集合物件,如Accessing Collection Properties。 -
在集合物件上呼叫集合運算子。 在符合鍵值編碼的物件中訪問集合屬性時,可以將集合運算子插入到鍵字串中,如Using Collection Operators。集合運算子根據預設的
NSKeyValueCoding
getter實現對集合執行操作,然後返回集合的新的過濾版本或表示集合的某些特徵的單個值。 -
訪問非物件屬性。 協議預設實現檢測非物件屬性,包括標量和結構體,並自動將它們包裝和解包為協議介面上使用的物件,如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。贈人玫瑰,手有餘香。