也许更简单的不是正确的词;简洁也可能。我很清楚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,
霍华德
答案 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是正确的,当返回一个对象时,它应该自动释放