티스토리 뷰
Key-Value Coding Programming Guide - Key-Value Coding Fundamentals - Representing Non-Object Values
rhinoPHS 2019. 1. 31. 18:34Key-Value Coding Programming Guide - Key-Value Coding Fundamentals - Representing Non-Object Values
NSObject에 있는 KVC 프로토콜 메소드는 기본적으로 객체와 객체가 아닌 프로퍼티에도 작동합니다.
(여기서 객체가 아닌 프로퍼티는 구조체 와 int, BOOL, char 등 primitive(원시 타입)을 가리킵니다. 이건 또 sacalar값이라고도 부릅니다.) 기본적으로 set할 때 객체 인자값이나 get 할 때 리턴값과 non-object 프로퍼티를 자동으로 변환합니다. 이렇게 하면 key-based getter와 setter가 스칼라 타입이나 구조체에서도 동일하게 작동합니다.
!!! 스위프트에는 모든 프로퍼티가 객체이기 때문에 상관없습니다.
valueForKey: 같은 getter 메소드를 보면 기본적으로 key에 해당하는 값을 리턴하기 위해서 특정 접근자 메소드나 인스턴스변수를 찾습니다. 이 부분은 Accessor Search Patterns에 나와 있습니다. 만약 리턴할 값이 객체 가아니면 ( 스칼라나 구조체이면 ) wrapping 해서 리턴합니다. 스칼라이면 NSNumber로, 구조체이면 NSValue로 래핑합니다.
위와 비슷하게 setValue:forKey와 같은 setter메소드도 key에 해당하는 프로퍼티에 값을 넣기위해 접근자 메소드나 인스턴스를 찾습니다. 만약 key에 해당하는 프로퍼티가 객체가 아니면 setter메소드는 인자 객체에 적절 <type>Value 보내서 기본값을 뽑아내고 저장합니다. ( setValue:forKey:를 이용해서 넣을 때는 랩핑해서 넣습니다.)
!!! setter메소드를 사용할 때 non-object property에 nil을 넣을 경우 setNilValueForKey:메시지를 호출합니다. 그리고 이 메소드는 기본적으로 NSInvalidArgumentExceptioon 예외를 발생시킵니다. 하지만 이 메소드를 오버라이드 해서 원하는 처리도 할 수 있습니다. Handling Non-Object Value에서 확인할 수 있습니다.
- Wrapping and Unwrapping Scalar Types
아래는 스칼라 타입 목록입니다. KVC가 wrap이나 unwrap 할때 사용하는 메소드들입니다.
KVC에서 get 할 때 객체가 아닌 값은 Creation method중 하나를 사용해서 NSNumber로 wrap한 다음리턴합니다.
KVC에서 set 할 때는 객체가 아닌 값은 사용자가 Creation method중 하나를 사용해서 넣어줘야겠죠.
또한 key에 해당하는 프로퍼티가 객체가 아니면 Accessor method중 하나를 적절히 사용해서 기본 값을 꺼내 프로퍼티에 넣어줍니다.
Data type | Creation method | Accessor method |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Data type | Creation method | Accessor method |
---|---|---|
|
| |
|
| |
|
|
|
|
|
typedef struct {
float x, y, z;
} ThreeFloats;
@interface MyClass
@property (nonatomic) ThreeFloats threeFloats;
@end