我可以在for循环之外声明*形状吗?

时间:2016-07-04 14:34:37

标签: objective-c

NSMutableArray *shapes = [[NSMutableArray alloc] init];
for (NSDictionary *object in array) {
    NSString *type = [object objectForKey:@"Type"];
    ShapeFactory *shape = [[[ShapeFactory alloc] init] shapeWithType:type dictionary:object];
    [shapes addObject:shape];
}
self.shapes = shapes;

我想知道我是否可以在循环外声明变量*形状并且仍可正常工作

2 个答案:

答案 0 :(得分:0)

应在循环外声明形状。 Shape在循环内声明,因为您想迭代每个对象。 所以你做的很好。

答案 1 :(得分:-2)

第一个:是的,正如Roee84所说,这是有效的语法,你可以这样做。但是,你在这里(从方法名称中推断出来的)工厂类模式和创建的形状的类型似乎是由一个特殊的参数定义的,我想知道你为什么要使用ShapeFactory。为什么不简单地使用id? 数组不关心对象,最好不要假装对象与工厂类对象的类型相同。

话虽如此,您的代码是正确的。当然,您也可以 声明shape*通常被认为是循环之外的类型btw的一部分)。你甚至不需要声明一个本地的可变数组(假设你的属性也是一个可变数组)。我将在此示例中使用id来说明我上面所说的内容:

self.shapes = [[NSMutableArray alloc] init];
id shape; // only declaration! note no * as id is basically NSObject *
for (NSDictionary *object in array) {
    NSString *type = [object objectForKey:@"Type"];
    shape = [[[ShapeFactory alloc] init] shapeWithType:type dictionary:object];
    [self.shapes addObject:shape];
}

如果你的属性不是一个可变数组,你当然不能self.shapes = [[NSMutableArray alloc] init]等等,但是我建议用最后一行完全安全并写{{ 1}}。这可能看起来有点偏执,但是这样你不仅可以将可变对象转换为不可变对象,实际上 是不可变对象(我经常有时写库)我不得不期待用户试图......充满活力...... ^^)。然后它就不能在背后发生变异。