티스토리 뷰

Key-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를 리턴합니다. 리턴하기 전에 메소드는 기존 객체 포인터를 새로 생성된 객체로 옮깁니다. 이렇게 수정을 할 때 그 객체가 수정이 가능해도 수정하는 대신 새로 만들어서 넣어 줍니다.


다음은 예제입니다.

Listing 6-1Validation of the name property
  1. Person* person = [[Person alloc] init];
  2. NSError* error;
  3. NSString* name = @"John";
  4. if (![person validateValue:&name forKey:@"name" error:&error]) {
  5. NSLog(@"%@",error);
  6. }

Automatic Validation

일반 적으로 KVC protocol이나 기본 구현은 유효성 검사를 자동으로 수행하는 메커니즘을 만들지 않습니다.

자동적으로 호출되지 않으니 개발자가 적절할 때 직접 호출해야 합니다.


예외적으로 Core Data와 Cocoa 바인딩에서 사용하면 자동적으로 호출한다고 합니다.

당연히 프로퍼티에 접근하기 전에 자동적으로 호출하겠죠


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함