【问题标题】:Trouble with Variable Name变量名问题
【发布时间】:2012-10-31 13:41:00
【问题描述】:

抱歉,如果这是一个初学者问题,但解决方案/正确的语法非常令人困惑。

使用 IOS,我正在尝试找到一种使用另一个外部变量创建实例变量名称的方法。

例如,我创建了自定义类(例如 NSCustomItem),现在我想在循环中使用例程初始化多个单独的实例,结果如下:

NSCustomItem *item1
NSCustomItem *item2
NSCustomItem *item3

我正在使用循环来生成多个对象。但是,在循环中,我似乎找不到使用标签或下标或命名字符串公式来创建对象名称的方法:

我一直在尝试类似的语法想法

 (NSCustomItem *)item[i] = [[NSCustomItem alloc] init];

但是,这不起作用。

有人可以提供帮助或提供信息吗?赞赏。

【问题讨论】:

  • 如果您要创建一系列对象,最好将它们放入数组中,而不是尝试为每个对象指定一个变量名。
  • 请远离 NS- 命名空间。这不是面向未来的。

标签: ios instance-variables


【解决方案1】:

创建项目并将每个项目添加到NSMutableArray,如下所示:

NSMutableArray *items = [[NSMutableArray alloc] init];

// then within your loop:
{
    [items addObject:[[NSCustomItem alloc] init]];
}

然后要访问它们,您可以使用 fast enumeration 遍历数组:

for (NSCustomItem *item in items) {
    // do something with item
}

或查看NSArray class reference,了解访问NSMutableArrayNSArray 的子类)中对象的其他方式。

【讨论】:

    【解决方案2】:

    您不能直接执行此操作。但是您可以使用NSMutableDictionary 来实现类似的功能,

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    

    然后,每次创建对象时,将其添加到字典中:

    for (int i = 0; i < count; i++) {
      [dict setObject:[[NSCustomItem alloc] init] 
               forKey:[NSString stringWithFormat:@"item%d", i]];//dynamically creates NSCustomItem objects with names item1, item2 etc.. till item'count'
    }
    

    现在当你想使用它时,只需使用,

    [dict valueForKey:item1];//equivalent to item1
    

    [dict valueForKey:[NSString stringWithFormat:@"item%d", i]];
    

    要访问item1(item1.property) 中的属性,请使用

    [[dict valueForKey:item1] property]
    

    【讨论】:

      【解决方案3】:

      永远不要使用 UI/NS/MF..i.e 之类的前缀命名自定义对象/类。前缀有助于识别该类所属的框架,用现有框架的前缀命名自己的对象并不是一个好习惯,但从技术上讲,这是可以的。而且,在 iIOS 应用程序中,你总是可以使用类似 C 的语法,你使用的语法不是声明数组的正确 C 方式,如果想坚持 C syantax,你可以使用类似这样的东西 -

      CustomClass *aTemp[2];
      
      //May use a for loop to populate the Array Elements
      aTemp[0] = [[CustomClass alloc]init];
      aTemp[1] = [[CustomClass alloc]init];    ....
      

      CustomClass *aTemp[]= {[[CustomClass alloc]init],[[CustomClass alloc] init]};
      

      编辑:

      CustomClass *aTemp[3];   
      
          for(int i=0;i<=2;i++){ 
           CustomClass *aCustomClass = [[CustomClass alloc]init]   
      
           // Changes/Customizations in the aCustomClass object 
      
            aTemp[i]= aCustomClass;
          }
      

      还要确保CustomClass 一切正常。

      如果你想用 Objective C API 写代码,@smileyborg 给出的答案很好。

      【讨论】:

      • 这个想法似乎最简单,但是当我尝试通过循环填充数组元素时,使用上面的第一个解决方案,我得到一个“可变大小的对象可能未初始化”错误。最后有什么想法吗?
      • 似乎 u 超出了声明数组时声明的大小。将循环从 i = 0 迭代到 i = n-1,其中“n”是当时数组的大小声明。
      猜你喜欢
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多