티스토리 뷰

Key-Value Coding Programming Guide - Adopting Key-Value Coding  - Achieving Basic Key-Value Coding Compliance

객체에 KVC를 적용할 때, NSObject나 NSobject를 상속받은 객체를 상속받아서 NSKeyValueCoding 프로토콜의 기본구현을 사용합니다. 기본 구현은 차례대로 개발자가 정의한 객체 인스턴스 변수(이하, ivars)와 접근자 메소드에 에 따라 작동합니다. ivars나 접근자 메소드는 특정 패턴에 따라 이름이 지어집니다. 이렇게 하면 KVC 메시지를 받을 때 key에 대응 할 수 있습니다.


@preperty지시자를 이용해서 프로퍼티를 선언하면 간단히 오브젝트비 C의 표준 패턴을 따를 수 있습니다. 그리고 컴파일러가 ivar와 접근자를 자동 생성하게 할 수 있습니다. 컴파일러는 기본적으로 예상된 패턴에 따릅니다.


!Note (as of swift 3) 

스위프트에서는 일반적으로 하는 방법대로 프로퍼티를 선언하면 적절한 접근자가 만들어지고 인스턴스 변수를 직접적으로 다룰 수 없습니다. 스위프트 가이드 에서 properties부분 참고, 더불어서 objective c 프로퍼티와 swift 프로포티 호환은 Using swift with cocoa and objective -c 문서에 accessing properites를 읽으면 됩니다.


objective c에서 접근자나 인스턴수 변수를 수동으로 구현하려면, 이 섹션 가이드라인 따라야 합니다. 그래야 KVC에 대응 할 수 있습니다. collection 프로퍼티를 다루려면 Definding Collection Methods에 있는  메소드르를 구현해야 합니다. KVC 유효검사를 하기 위해서는 Adding Validation 메소드를 구현해야 합니다.


!Note

KVC는의 기본구현은 여기에 설명한 것보다 넓은 범위의 접근자와 인스턴스 변수를 커버합니다. 기존 코드가 다른 변수나 접근자를 가지고 있다면 검색패턴을 검사해서 객체 프로퍼티들을 찾을 수 있는지 확인해야 합니다.



Basic Getters

추가적인 사용자 정의 작업을 하는 중에 프로퍼티의 값을 리턴하는 getter를 구현하려면, 다음과 같이 하면 됩니다.


  1. - (NSString*)title
  2. {
  3. // Extra getter logic…
  4. return _title;
  5. }

Boolean 값이라면, is를 앞에 사용해도 됩니다.

  1. - (BOOL)isHidden
  2. {
  3. // Extra getter logic…
  4. return _hidden;
  5. }

앞서 설명했지만 프로퍼티가 스칼라나 구조체이면 NSNumber, NSValue로 wrapping해서 리턴합니다. 이 부분은 KVC에서 알아서 하니 개발자가 따로 할 일은 없습니다.


Basic Setters

setter는 다음과 같습니다. 기본적으로 camelCase를 사용하고 set을 앞에 넣습니다.


  1. - (void)setHidden:(BOOL)hidden
  2. {
  3. // Extra setter logic…
  4. _hidden = hidden;
  5. }

!WARNING

set<Key>메소드에서 validation 메소드들을 절대 호출하지 마세요!


프로퍼티가 객체 타입이 아니라면(스칼라나 구조체), 프로토콜의 기본 구현은 set메소드로 들어오는 값을 unwrapping해서 그 안에 값을 프로퍼티에 대입합니다. 이 또한 개발자가 할일 이 없습니다. 다만, 객체가 아닌 프로퍼티에 nil이 들어 올 수 있습니다. 이는 setNIlValieForKey: 메소드로 다룰 수 있습니다.

  1. - (void)setNilValueForKey:(NSString *)key
  2. {
  3. if ([key isEqualToString:@"hidden"]) {
  4. [self setValue:@(NO) forKey:@”hidden];
  5. } else {
  6. [super setNilValueForKey:key];
  7. }
  8. }

setter를 자동완성으로 만들어도 이 메소드를 오버라이드 할 수 있습니다.

Instance Variables

KVC의 접근자 메소드를 프로퍼티 접근자를 찾을 수 없습니다. 대신 클래스의 accessInstanceVariableDirectly메소드를 이용해서 인스턴스 변수에 접근 할 수 있습니다. 기본적으로 YES를 반환하지만 오버라이드해서 NO를 반환하게 할 수도 있다.


인스턴스 변수를 사용하게 할 경우, 이름에 주의해야 합니다. 프로퍼티 이름의 접두사로 _(underscore)가 들어 가야합니다. 일반적으로 컴파일러가 해줍니다만, @synthesize 지시어를 사용하면 강제로 해줘야 합니다.


여려 경우에서, @synthesize지시어 사용하는 것이나 컴파일러가 자동생성 하는 것 대신에 @dynamic지시어를 써서 컴파일러에게 런타임에 getter와 setter를 만들어 주겠다고 알립니다. 이렇게 하면 getter 자동생성을 피할 수 있고, 이로 인해 collection 접근자를 제공할 수 있습니다.이 경우에는 인터페이스 선언 부분에 직접 인스턴스 변수를 선언해야 합니다.



  1. @interface MyObject : NSObject {
  2. NSString* _title;
  3. }
  4. @property (nonatomic) NSString* title;
  5. @end


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함