如何在 for 循环中将名为 obj1, obj2, obj3, ... 的对象添加到 NSMutableArray
How to add objects named obj1, obj2, obj3, ... to NSMutableArray in for loop
有没有更好的办法
_studentArray = [[NSMutableArray alloc] initWithObjects:student0, student1, student2, student3, student4, student5, student6, student7, student8, student9, student10, student11, student12, student13, student14, student15, student16, student17, student18, student19, nil];
使用 FOR 循环?
取决于您一次从何处获得多少对象的来源
如果您一次性获得所有对象,您可以按上述方式添加或使用 for 循环添加单个对象。
如果您一次获取一个对象,请添加它并添加其他对象。
很简单,你只需要开始for循环就可以了。
for(int i=0;i<20;i++) {
NSString *obj = [[NSString alloc]init];
[_studentArray addObject:obj];
}
这取决于学生对象的来源、创建方式等。但我认为您应该重新考虑您的代码,不要像您那样为每个学生提供参考。试想一下,如果 facebook 也像您一样引用每个用户,那会有多难?
如果您自己创建学生对象,请尝试这样的方法:
- (void)viewDidLoad {
_studentArray = [NSMutableArray new];
for (int i = 0; i < 20; i++) {
Student *student = [[Student alloc] init];
[_studentArray addObject:student];
}
//At this point you will have the same that you did.
//To access the 2nd student for example, you could do
Student *theSecond = _studentArray[1]; //(because array index starts from 0)
theSecond.name = @"Peter";
}
或者如果您想同时创建和添加到 _studentsArray
:
- (void)viewDidLoad {
_studentArray = [NSMutableArray new];
[self registerStudentWithName:@"Peter"];
[self registerStudentWithName:@"John"];
//and so on...
Student *firstStudent = _studentArray[0];
NSLog(@"%@", firstStudent.name); //Prints Peter
}
- (void)registerStudentWithName:(NSString *)name {
Student *student = [[Student alloc] init];
student.name = name;
[_studentArray addObject:student];
}
正如其他人所指出的,最好不要首先在唯一命名的变量(student0、student1、student2 等)中创建 20 个不同的对象。正如其他人指出的那样,最好首先在数组中创建它们。
如果您必须处理大量这样的实例变量,您应该能够使用 valueForKey 找到它们:
_studentArray = [NSMutableArray arrayWithCapacity: 20];
for (int i=0; i< 20; i++)
{
NSString *keyName = [NSString stringWithFormat: @"student%d", i];
id aStudentVar = [self objectForKey: keyName];
_studentArray[i] = aStudentVar;
}
我还没有对此进行测试,但它应该可以工作。不过,再次强调,拥有那么多按顺序命名的实例变量是一个糟糕的“code smell”。几乎可以肯定,无论您正在做什么,都有更好的方法。
_studentArray = [[NSMutableArray alloc] initWithObjects:student0, student1, student2, student3, student4, student5, student6, student7, student8, student9, student10, student11, student12, student13, student14, student15, student16, student17, student18, student19, nil];
使用 FOR 循环?
取决于您一次从何处获得多少对象的来源
如果您一次性获得所有对象,您可以按上述方式添加或使用 for 循环添加单个对象。
如果您一次获取一个对象,请添加它并添加其他对象。
很简单,你只需要开始for循环就可以了。
for(int i=0;i<20;i++) {
NSString *obj = [[NSString alloc]init];
[_studentArray addObject:obj];
}
这取决于学生对象的来源、创建方式等。但我认为您应该重新考虑您的代码,不要像您那样为每个学生提供参考。试想一下,如果 facebook 也像您一样引用每个用户,那会有多难?
如果您自己创建学生对象,请尝试这样的方法:
- (void)viewDidLoad {
_studentArray = [NSMutableArray new];
for (int i = 0; i < 20; i++) {
Student *student = [[Student alloc] init];
[_studentArray addObject:student];
}
//At this point you will have the same that you did.
//To access the 2nd student for example, you could do
Student *theSecond = _studentArray[1]; //(because array index starts from 0)
theSecond.name = @"Peter";
}
或者如果您想同时创建和添加到 _studentsArray
:
- (void)viewDidLoad {
_studentArray = [NSMutableArray new];
[self registerStudentWithName:@"Peter"];
[self registerStudentWithName:@"John"];
//and so on...
Student *firstStudent = _studentArray[0];
NSLog(@"%@", firstStudent.name); //Prints Peter
}
- (void)registerStudentWithName:(NSString *)name {
Student *student = [[Student alloc] init];
student.name = name;
[_studentArray addObject:student];
}
正如其他人所指出的,最好不要首先在唯一命名的变量(student0、student1、student2 等)中创建 20 个不同的对象。正如其他人指出的那样,最好首先在数组中创建它们。
如果您必须处理大量这样的实例变量,您应该能够使用 valueForKey 找到它们:
_studentArray = [NSMutableArray arrayWithCapacity: 20];
for (int i=0; i< 20; i++)
{
NSString *keyName = [NSString stringWithFormat: @"student%d", i];
id aStudentVar = [self objectForKey: keyName];
_studentArray[i] = aStudentVar;
}
我还没有对此进行测试,但它应该可以工作。不过,再次强调,拥有那么多按顺序命名的实例变量是一个糟糕的“code smell”。几乎可以肯定,无论您正在做什么,都有更好的方法。