오브젝트C2010. 6. 21. 09:31
[펌] Key-Value Coding

Cocoa string(key)통하여객체의어떤 instance variable값을가져오거나설정하는방법을제공한다. 이것을 key-value coding(KVC)이라고한다. KVC에서는먼저 key들어온 string같은이름을갖는 instance variable accessor method찾아이를실행하여값을가져오거나설정한다. 만약해당 accessor method존재하지않으면직접 instance variable접근하여작업을수행한다. 다음은 key-value coding통하여 Book객체인 book instance variable 하나인 title값을가져오고설정하는코드이다.


    NSString* title = [book valueForKey:@"title"];

    [book setValue:@"Harry Potter"forKey:@"title"];



  Object아닌int, float, struct같은 scalar value NSNumber 또는 NSValue wrapping하여사용한다. 다음은 bookint타입 variable page값을가져오고설정하는코드이다


    NSValue* page = [book valueForKey:@"page"];

    [book setValue:[NSNumbernumberWithInt:540] forKey:@"page"];



  Object(book) sub-object(author)포함하는경우 key path통하여 sub-object instance variable접근할있다.


    NSString* name = [book valueForKeyPath:@"author.name"];

    [book setValue:@"Celete"forKeyPath:@"author.name"];



  Object(library) sub-object-array(books)포함하는경우그에해당하는모든값들이 array 형태로리턴되거나새로운값으로바뀌게된다.

    

    NSArray* titles = [library valueForKeyPath:@"books.title"];

    [library setValue:@"Harry Potter"forKeyPath:@"books.title"];



  Key path @count, @sum, @avg, @max, @min, @distinctUnionOfObjects 등과같은 operator들과함께쓰여특별한기능을있다.


    NSNumber* numberOfBooks = [library valueForKeyPath:@"books.@count"];

    NSNumber* sumOfPagesOfBooks = [library valueForKeyPath:@"books.@sum.page"];

    NSNumber* avgPagesOfBooks = [library valueForKeyPath:@"books.@avg.page"];



위와같이 key path operator key path 중간에끼어역할을한다. (operator중간에끼어있는게처음에는이상하게느껴졌는데, 지금보니중간에끼어있는게 readability높여주는같다. 예를들어@"books.@sum.page""books에서 sum of page구하여라"라고자연스럽게읽힌다.


  @distinctUnionOfObjects결과에서중복된것이없도록만들어준다.


    NSArray* authors = [library valueForKeyPath:@"books.@distinctUnionOfObjects.author"];



다음과같이 key들의 array넘겨 key그에해당하는 valueNSDictionary형태로받아볼수도있다

                                                      

    NSArray* keys = [NSArrayarrayWithObjects:@"title", @"page", @"author", nil];

    NSDictionary* bookValues = [book dictionaryWithValuesForKeys:keys];


또는다음과같이 key그에해당하는 value저장된NSDictionary넘겨 object instance variable값들을설정할수도있다.


    NSDictionary* values = [NSDictionary dictionaryWithObjectAndKeys:

                                       @"Harry Potter", @"title",

                                       [NSNumbernumberWithInt:540], @"page",

                                       @"J.K. Rolling", @"author",

                                       nil];

    [book setValueForKeysWithDictionary: values];




  setNilValueForKey 메소드를 override하여int, float같은 scalar value들을nil설정할있도록있다.

                                                      

    - (void) setNilValueForKey: (NSString*) key

    {

        if ([key isEqualToString:@"page"])

        {

            page = 0;

        }

        else

        {

            [supersetNilValueForKey:key];

        }

    }

     

    

    [book setValue:nilforKey:@"page"];




Reference

[1] Dalrymple. M., Learn Objective-C on the Mac, Apress.



출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110086941695

'오브젝트C' 카테고리의 다른 글

OSX를 VMware 설치후 해상도 변경  (0) 2010.06.21
[펌] Delegate  (0) 2010.06.21
[펌] Key-Value Coding  (0) 2010.06.21
[Objective-C] 동적으로 메소드 호출하기  (0) 2010.06.21
[펌] 메소드의 포인터, IMP란?  (0) 2010.06.21
[펌] Objective-C 생성자  (0) 2010.06.21
Posted by 오늘마감

댓글을 달아 주세요