В поисках более простого решения Objective-C - PullRequest
2 голосов
/ 07 марта 2009

Может быть, проще не правильное слово; кратко может сделать то же самое. Я хорошо знаю, что Objective-C - это многословный язык; Мне просто интересно, должно ли оно быть столь же многословным, как и в решении, которое я показываю ниже. Я относительно плохо знаком с языком.

Этот фрагмент кода подсчитывает количество полей каждого типа в записи в соответствии с генерацией UITableViewCell переменной высоты, содержащей одну метку на поле. Мой вопрос не о том, как это сделать - я уже понял это - мне просто интересно: нет ли более простого или менее подробного способа сделать это в Objective-C, используя объект NSDictionary? Это так кратко, как это получается, используя NSDictionary? Решения, использующие другие объекты типа коллекции, также приветствуются.

Вот мой метод -PartsRecord.countFields. Я немного упростил код.

-(NSDictionary*) countFields {  
NSDictionary* dict = [[NSDictionary alloc] initWithObjectAndKeys:  
     @"s", [NSNumber numberWithUnsignedInt: [self.struts count]],  
     @"h", [NSNumber numberWithUnsignedInt: [self.headAssemblies count]],  
     @"l", (self.leftVent == nil) ?   [NSNumber numberWithUnsignedInt: 0] :  
                                      [NSNumber numberWithUnsignedInt: 1],  
     @"r", (self.rightVent == nil) ?  [NSNumber numberWithUnsignedInt: 0] :  
                                      [NSNumber numberWithUnsignedInt: 1],  
     nil ];  
return dict;  

}

Любые ошибки в приведенном выше коде являются ошибками в транскрипции, а не фактическими ошибками в коде.
ТИА,
Говард

Ответы [ 6 ]

3 голосов
/ 07 марта 2009

Если вы не собираетесь вводить цифры, ваш объект упорядочен неправильно. Это должен быть объект, затем ключ.

dict = [NSDictionary dictionaryWithObjectsAndKeys:
   [NSNumber numberWithUnsignedInt: [self.struts count]], @"s",
   [NSNumber numberWithUnsignedInt: [self.headAssemblies count]], @"h",
   [NSNumber numberWithUnsignedInt: self.leftVent  ? 1 : 0], @"l", 
   [NSNumber numberWithUnsignedInt: self.rightVent ? 1 : 0], @"r",
   nil ];

Таким образом, вызов [dict objectForKey:@"s"] вернёт объект числа [self.struts count].

3 голосов
/ 07 марта 2009
@"l", [NSNumber numberWithUnsignedInt: self.leftVent  ? 1 : 0],
@"r", [NSNumber numberWithUnsignedInt: self.rightVent ? 1 : 0],

сократит его на 2 строки

2 голосов
/ 07 марта 2009

Вы также можете изменить [[NSDictionary alloc] initWithObjectsAndKeys:] на [NSDictionary dictionaryWithObjectsAndKeys:].

В любом случае это было бы хорошей идеей, поскольку ваш код выделяет NSDictionary без его освобождения. -dictionaryWithObjectsAndKeys: возвращает автоматически выпущенный словарь.

1 голос
/ 07 марта 2009

Должен ли это быть словарь? Если нет, то, возможно, прибегнуть к некоторому простому С будет легче понять.

typedef struct {
    unsigned strutCount;
    unsigned headAssembliesCount;
    BOOL leftVent;
    BOOL rightVent;
} Fields;


- (void) countFields:(Fields *) fields
{
    fields->strutCount = [self.struts count];
    fields->headAssembliesCount = [self.headAssemblies count];
    fields->leftVent = (self.leftVent != nil);
    fields->rightVent = (self.rightVent != nil);
}
0 голосов
/ 07 марта 2009

Я думаю, что с помощью макросов вполне можно упростить ввод текста и повысить читаемость

#define SET_KEY_NUMBER( _key, _value ) \
  [NSNumber numberWithUnsignedInt:_value], _key
#define SET_KEY_BOOL( _key, _bool ) \
  [NSNumber numberWithUnsignedInt: (_bool) ? 1 : 0], _key

-(NSDictionary*) countFields {  
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      SET_KEY_NUMBER( @"s", [self.struts count] ),
      SET_KEY_NUMBER( @"h", [self.headAssemblies count] ),
      SET_KEY_BOOL(   @"l", self.leftVent == nil ),
      SET_KEY_BOOL(   @"r", self. rightVent == nil ),
      nil ];  
    return dict;
}

... и @Matt Ball верны, при возврате объекта он должен быть автоматически освобожден

0 голосов
/ 07 марта 2009

-[NSNumber numberWithInt: 0] и -[NSNumber numberWithUnsignedInt: 0] - это одно и то же число (фактически, они могут даже быть одним и тем же объектом в некоторых реализациях Какао).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...