【问题标题】:Creating 20 objects in a loop循环创建 20 个对象
【发布时间】:2011-09-22 11:54:37
【问题描述】:

我需要一些新手帮助。 所以基本上我正在尝试创建 20 个单独的对象(玩家)。每个玩家都有姓名、年龄和身高。

而不是写'Person *player = [[Person alloc] init];'二十次,我做了一个循环。 我认为循环有效,因为 [myArray count] 有 20 个对象。

我的问题:

这 20 个对象是唯一的吗(都具有相同的名称、年龄、身高)?

为 MyArray 的每个元素中的每个对象指定名称、年龄、高度的最佳方法是什么?

所以我的最终目标是能够做这样的事情:

NSLog(@"%@ is %i high and is %i years old", player1.name, player1.height, player1.age);

NSLog(@"%@ is %i high and is %i years old", player2.name, player2.height, player2.age); 

等等……

我希望以上内容有意义,非常感谢您的帮助。

#import <Foundation/Foundation.h>

#import "Person.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


    NSMutableArray  *myArray = [[NSMutableArray alloc]initWithCapacity:20];


    for (int i = 0; i < 20; i++)
    {
        Person *player = [[Person alloc] init];
        player.age = 10;
        player.height = 10;
        player.name = @"player";
        [myArray addObject:player];       
        [player release];         
    }

    NSLog(@"The number of players in myArray = %i", [myArray count]); // I now have 20 players (objects) in myArray.

//How can I now give each player object an individual name, age & height ??     
    [pool drain];
    return 0;
}

【问题讨论】:

  • 这些个人姓名、年龄、身高从何而来?

标签: objective-c


【解决方案1】:
  • 对象是唯一的吗?是的,他们是。
  • 为每个对象命名、年龄、身高的最佳方式是什么?这个问题尚不清楚,因此您在循环中为对象提供年龄、身高和名称的方式是正确的,但您当然要为所有对象提供相同的信息;给他们唯一的名字取决于你的应用逻辑,例如你可以用这种方式随机分配年龄:
player.age = arc4random()%90;

您可以对高度执行相同的操作(最终使用稍微复杂的公式,例如 140+arc4random()%50)。最后对于高度,您可以通过这种方式分配派生名称:

player.name = [NSString stringWithFormat:@"Player-%d",i];

分配名称 Player-0, Player-1, ...

  • 最后打印出NSLog中的数据:
NSLog(@"Player %d : name=%@ height=%d age=%d",i,player.name,player.height,player.d)

或在不同的循环中:


int i = 0;
for(Person *player in myArray) {
  NSLog(@"Player %d : name=%@ height=%d age=%d",i,player.name,player.height,player.d);
  i++;
}

【讨论】:

    【解决方案2】:

    几个项目。

    如果我正确理解了您的后续问题,您要做的是访问您存储在数组中的对象,以便您可以更改它们的属性值。

    但是,上面的发帖人回答了你提出的实际问题,你应该标记他的正确。

    如果您想遍历数组中的每个项目,您可以执行以下操作:

    for (int i=0; i<[players count]; i++) {
    Player *aPlayer = [players objectAtIndex:i];
    aPlayer.name = @"joe";
    }
    

    如果您只想访问单个播放器:

    Player *aPlayer = [players objectAtIndex:4];
    aPlayer.name = @"joe";
    

    您可能还想自定义您的 Player 类并覆盖描述,这样您就不必重复输入复杂的 NSLog 语句。

    -(NSString *)description{
        return [NSString stringWithFormat:@"name = %@ age = %d height = %d", self.name, self.age, self.height];
    }
    

    通过重写描述方法,在您的对象上调用 NSLog 将从该语句返回字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2015-02-23
      • 2016-11-11
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      相关资源
      最近更新 更多