티스토리 뷰
Key-Value Coding Programming Guide - Key-Value Coding Fundamentals - validating Properties
rhinoPHS 2019. 2. 1. 08:17Key-Value Coding Programming Guide - Key-Value Coding Fundamentals - validating Properties
KVC코딩 프로토콜에는 프로퍼티 값을 검증하는 메소드가 있습니다. KVC에서 key(path)로 프러퍼티에 접근해서 get이나 set하는 것처럼 프로퍼티 검증을 합니다. validateValue:forKey:error, validateValue:forKeyPath:error:메소드를 이용하면 됩니다. 이 메소드는 기본적으로 메시지를 받은 객체나 keypath끝에 있는 객체에 validate<Key>:error:패턴에 해당하는 메소드가 있는지 찾습니다. 만약 그런 메소드가 없으면 기본적으로 YES를 리턴합니다. 만약 존재하면 메소드에 구현된대로 작동합니다.
!Note
이 검증은 objc에서만 사용하면 됩니다. 스위프트의 경우 컴파일러의 옵셔널이나 강력한 타입체크 기능으로 인해서 자동적으로 다뤄집니다. 이는 런타임 API contracts를 테스트하기 위해 내장된 willSet이나 didSet 프로퍼티 observers를 사용할 때 일어납니다.이는 The Swift Programming Language 공식문서에 설명돼 있습니다.
검증할 때 일어날 수 있는 3가지
검증 메소드는 값과 erorr 인자값을 참조로 받기 때문에 3가지 결과가 나올 수 있습니다.
1. 값 객체가 유효하다고 판단하면 값이나 error를 바꾸지 않고 YES를 리턴합니다.
2. 값 객체가 유효하지 않아도 바꾸지 않습니다. 다만 이 경우에는 NO를 리턴하고 인자값으로 들어온 error에 Error 객체를 넣어서 실패이유를 알려줍니다.
3. 값 객체가 유효하지 않으면 다르게도 동작합니다. 유요한 새로운 객체를 새로 만들어서 대입합니다. 이 경우에는 error객체는 건들지 않고 YES를 리턴합니다. 리턴하기 전에 메소드는 기존 객체 포인터를 새로 생성된 객체로 옮깁니다. 이렇게 수정을 할 때 그 객체가 수정이 가능해도 수정하는 대신 새로 만들어서 넣어 줍니다.
다음은 예제입니다.
Person* person = [[Person alloc] init];
NSError* error;
NSString* name = @"John";
if (![person validateValue:&name forKey:@"name" error:&error]) {
NSLog(@"%@",error);
}
Automatic Validation
일반 적으로 KVC protocol이나 기본 구현은 유효성 검사를 자동으로 수행하는 메커니즘을 만들지 않습니다.
자동적으로 호출되지 않으니 개발자가 적절할 때 직접 호출해야 합니다.
예외적으로 Core Data와 Cocoa 바인딩에서 사용하면 자동적으로 호출한다고 합니다.
당연히 프로퍼티에 접근하기 전에 자동적으로 호출하겠죠