Key-Value Coding Programming Guide 官方文件第二部分第5節 2018.9.20 第一次修正
Key-Value Coding Fundamatals--Validating Properties
驗證屬性
鍵值編碼協議定義了支援屬性驗證的方法。就像使用基於鍵的訪問器來讀取和寫入符合鍵值編碼的物件的屬性一樣,您也可以按鍵(或鍵路徑)驗證屬性。當您呼叫validateValue:forKey:error:
(或validateValue:forKeyPath:error:
) 方法時, 協議的預設實現將搜尋接收驗證訊息的物件 (或在鍵路徑的末尾的物件), 以查詢名稱與模式匹配的方法validate<Key>:error:。如果物件沒有此類方法, 則預設情況下驗證成功, 預設實現返回
YES`。當存在屬性特定的驗證方法時, 預設實現將返回撥用該方法的結果。
注意 您通常僅在
Objective-C
中使用此處描述的驗證。在 Swift 中, 通過依賴 optionals 和強型別檢查的編譯器支援, 可以更便捷地處理屬性驗證, 同時使用內建的 willSet 和 didSet 屬性觀察器來測試任何執行時 API 協定, 詳見 The Swift Programming Language (Swift 4.2) 中*Property Observers*章節對willSet
didSet
的描述。
由於屬性特定的驗證方法通過引用的方式接收值和錯誤引數, 因此驗證有三種可能的結果:
- 驗證方法判斷值物件有效並返回YES而不改變值或錯誤。
- 驗證方法判斷值物件無效, 但選擇不更改它。在這種情況下, 該方法返回NO並將錯誤引用 (如果呼叫方提供) 設定到
NSError
指示失敗原因的物件。 - 驗證方法判斷值物件無效, 但建立一個新的、有效的物件作為替換。在這種情況下, 該方法返回YES同時保持錯誤物件不變。返回之前, 該方法修改值引用以指向新值物件。當它進行修改時, 該方法總是建立一個新物件, 而不是修改舊值, 即使 value 物件是可變的。
清單 6-1顯示瞭如何呼叫name
字串的驗證的示例。
Person* person = [[Person alloc] init];
NSError* error;
NSString* name = @"John";
if (![person validateValue:&name forKey:@"name" error:&error]) {
NSLog(@"%@",error);
}
複製程式碼
自動驗證
通常, 鍵值編碼協議及其預設實現都不定義任何自動執行驗證的機制。相反, 您可以在您的應用程式中使用適合的驗證方法。
某些其他Cocoa技術在某些情況下會自動進行驗證。例如, Core Data
會在儲存託管物件上下文時自動執行驗證 (詳見*Core Data Programming Guide)。此外, 在 macOS 中, Cocoa Bindings
允許您指定驗證是否自動進行 (請閱讀Cocoa Bindings Programming Topics*瞭解有關Cocoa Bindings的更多資訊。)。
由於筆者水平有限,文中如果有錯誤的地方,或者有更好的方法,還望大神指出。 附上本文的所有 demo 下載連結,【GitHub】。 如果你看完後覺得對你有所幫助,還望在 GitHub 上點個 star。贈人玫瑰,手有餘香。