Obj -C простой способ конвертировать из NSObject со свойствами в NSDictionary?

Я наткнулся на кое-что, что в конце концов понял, но думаю, что, возможно, есть гораздо более эффективный способ сделать это.

У меня был объект (NSObject, который принял протокол MKAnnotation ), который имел ряд свойств (заголовок, подзаголовок, широта, долгота, информация и т. д. ). Мне нужно было передать этот объект другому объекту, который хотел извлечь из него информацию с помощью методов objectForKey, как NSDictionary (, потому что это то, что он получал от другого контроллера представления ).

В итоге я создал новый NSMutableDictionary и использовал setObject :forKey для передачи каждой важной информации, а затем я просто передал только что созданный словарь.

Был ли более простой способ сделать это?

Вот соответствующий код.:

// sender contains a custom map annotation that has extra properties...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{    
    if ([[segue identifier] isEqualToString:@"showDetailFromMap"]) 
{
    DetailViewController *dest =[segue destinationViewController];

    //make a dictionary from annotaion to pass info
    NSMutableDictionary *myValues =[[NSMutableDictionary alloc] init];
    //fill with the relevant info
    [myValues setObject:[sender title] forKey:@"title"] ;
    [myValues setObject:[sender subtitle] forKey:@"subtitle"];
    [myValues setObject:[sender info] forKey:@"info"];
    [myValues setObject:[sender pic] forKey:@"pic"];
    [myValues setObject:[sender latitude] forKey:@"latitude"];
    [myValues setObject:[sender longitude] forKey:@"longitude"];
    //pass values
    dest.curLoc = myValues;
    }
}

Заранее спасибо за вашу коллективную мудрость.


Вот что я придумал, спасибо ребятам из ниже...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{    
if ([[segue identifier] isEqualToString:@"showDetailFromMap"]) 
{
    DetailViewController *dest =[segue destinationViewController];
    NSArray *myKeys = [NSArray arrayWithObjects:
@"title",@"subtitle",@"info",@"pic",@"latitude",@"longitude", nil];

    //make a dictionary from annotaion to pass info
    NSDictionary *myValues =[sender dictionaryWithValuesForKeys:myKeys];

    //pass values
    dest.curLoc = myValues;
}

}

И еще более простое исправление, как показано ниже...

Использование valueForKey вместо объекта для получения ключа информация.


14
задан james Burns 25 April 2012 в 21:48
поделиться