寻找更简单的Objective-C解决方案

时间:2009-03-07 04:30:05

标签: objective-c

也许更简单的不是正确的词;简洁也可能。我很清楚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;  

}

上述代码中的任何错误都是转录错误,而不是代码中的实际错误 TIA,
霍华德

6 个答案:

答案 0 :(得分:3)

@"l", [NSNumber numberWithUnsignedInt: self.leftVent  ? 1 : 0],
@"r", [NSNumber numberWithUnsignedInt: self.rightVent ? 1 : 0],

将它缩短2行

答案 1 :(得分:3)

除非您打算键入数字,否则您的对象排序是错误的。它应该是对象然后键。

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]数字对象。

答案 2 :(得分:2)

您也可以将[[NSDictionary alloc] initWithObjectsAndKeys:]更改为[NSDictionary dictionaryWithObjectsAndKeys:]

无论如何,这是一个好主意,因为您的代码在不释放它的情况下分配NSDictionary-dictionaryWithObjectsAndKeys:返回自动释放的字典。

答案 3 :(得分:1)

它必须是字典吗?如果没有,或许诉诸一些普通的C可能更容易理解。

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);
}

答案 4 :(得分:0)

-[NSNumber numberWithInt: 0]-[NSNumber numberWithUnsignedInt: 0]是相同的数字(实际上,它们在某些Cocoa实现中甚至可能是同一个对象)。

答案 5 :(得分:0)

我认为使用宏可以简化输入并提高可读性

#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是正确的,当返回一个对象时,它应该自动释放