为什么 replaceObjectAtIndex 取决于我是否在循环中使用新定义?
Why does replaceObjectAtIndex depend on whether or not I use a new definition in the loop?
我有两个密码。以下是不工作的:
NSMutableArray *tmpArray = [[NSMutableArray alloc] init];
for (int i=0; i<[dataSetArray count]; i++) {
tmpArray = (NSMutableArray *) [dataSetArray objectAtIndex:i];
// OR use: tmpArray = dataSetArray[i]
... doing stuff
[tmpArray replaceObjectAtIndex:0 withObject:tmpStr];
}
虽然这有效:
for (int i=0; i<[dataSetArray count]; i++) {
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithArray:[dataSetArray objectAtIndex:i]];
... doing stuff
[tmpArray replaceObjectAtIndex:0 withObject:tmpStr];
}
两个问题:
- 第一个代码没有生成
NSMutableArray
。为什么?我声明
多于。
- 是否有更好的方法来获得相同的结果。我只是
不喜欢在循环中定义变量。这使得代码
不可读。
--- 编辑:
这里是完整代码:
数据类型是:
dataSetArray:NSMutableArray。但是,它的内容(即 dataSetArray[i])是 NSArray(我从 excel 文件中将它们读入程序)。
NSString *tmpStr = [[NSString alloc] init];
for (int i=0; i<[dataSetArray count]; i++) {
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithArray:[dataSetArray objectAtIndex:i]];
for (int j=0; j<[tmpArray count]; j++) {
if ( [dataSetArray[0][j] isEqualToString:@"Number"] ) {continue;}
tmpStr = (NSString *) [tmpArray objectAtIndex:j];
// replace single backslash by double-backslash:
tmpStr = [tmpStr stringByReplacingOccurrencesOfString:@"\" withString:@"\\"];
// replace first dollar sign by "<p>\[" and second by "\]</p>"
// Use a methode defined in the NSString+Extension
tmpStr = [tmpStr replaceTexFormulaSigns:tmpStr];
//NSLog(@"j=%d", j);
//NSLog(@"tmpArray is of type: %@", [tmpArray class]);
//NSLog(@" tmpStr is of type: %@", [tmpStr class]);
[tmpArray replaceObjectAtIndex:j withObject:tmpStr];
}
[dataSetArray replaceObjectAtIndex:i withObject:tmpArray];
}
所以即使我使用了你的建议,我仍然面临着与内部数组相同的问题。
The first code doesn't yield a NSMutableArray. Why? I declare it above.
引用变量的声明tmpArray
不会改变引用对象的类型。它仍然是一个(不可变的)数组。
在第一个片段的开头创建可变数组没有任何意义,因为对它的引用被覆盖了。
Is there a better way to obtain the same result. I just dislike defining variables in a loop. This makes the code unreadable.
是的。第二个示例以某种方式工作,但做一些完全不同的事情。 (它总是创建一个包含单个项目的新数组。不,那不是真的。它根本不应该编译。)
你应该这样做:
NSMutableArray *tmpArray = [dataSetArray mutableCopy];
for (int i=0; i<[dataSetArray count]; i++)
{
…
[tmpArray replaceObjectAtIndex:i withObject:tmpStr];
}
您应该真的获得一些关于对象和对象引用的额外知识。
我有两个密码。以下是不工作的:
NSMutableArray *tmpArray = [[NSMutableArray alloc] init];
for (int i=0; i<[dataSetArray count]; i++) {
tmpArray = (NSMutableArray *) [dataSetArray objectAtIndex:i];
// OR use: tmpArray = dataSetArray[i]
... doing stuff
[tmpArray replaceObjectAtIndex:0 withObject:tmpStr];
}
虽然这有效:
for (int i=0; i<[dataSetArray count]; i++) {
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithArray:[dataSetArray objectAtIndex:i]];
... doing stuff
[tmpArray replaceObjectAtIndex:0 withObject:tmpStr];
}
两个问题:
- 第一个代码没有生成
NSMutableArray
。为什么?我声明 多于。 - 是否有更好的方法来获得相同的结果。我只是 不喜欢在循环中定义变量。这使得代码 不可读。
--- 编辑:
这里是完整代码:
数据类型是:
dataSetArray:NSMutableArray。但是,它的内容(即 dataSetArray[i])是 NSArray(我从 excel 文件中将它们读入程序)。
NSString *tmpStr = [[NSString alloc] init];
for (int i=0; i<[dataSetArray count]; i++) {
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithArray:[dataSetArray objectAtIndex:i]];
for (int j=0; j<[tmpArray count]; j++) {
if ( [dataSetArray[0][j] isEqualToString:@"Number"] ) {continue;}
tmpStr = (NSString *) [tmpArray objectAtIndex:j];
// replace single backslash by double-backslash:
tmpStr = [tmpStr stringByReplacingOccurrencesOfString:@"\" withString:@"\\"];
// replace first dollar sign by "<p>\[" and second by "\]</p>"
// Use a methode defined in the NSString+Extension
tmpStr = [tmpStr replaceTexFormulaSigns:tmpStr];
//NSLog(@"j=%d", j);
//NSLog(@"tmpArray is of type: %@", [tmpArray class]);
//NSLog(@" tmpStr is of type: %@", [tmpStr class]);
[tmpArray replaceObjectAtIndex:j withObject:tmpStr];
}
[dataSetArray replaceObjectAtIndex:i withObject:tmpArray];
}
所以即使我使用了你的建议,我仍然面临着与内部数组相同的问题。
The first code doesn't yield a NSMutableArray. Why? I declare it above.
引用变量的声明tmpArray
不会改变引用对象的类型。它仍然是一个(不可变的)数组。
在第一个片段的开头创建可变数组没有任何意义,因为对它的引用被覆盖了。
Is there a better way to obtain the same result. I just dislike defining variables in a loop. This makes the code unreadable.
是的。第二个示例以某种方式工作,但做一些完全不同的事情。 (它总是创建一个包含单个项目的新数组。不,那不是真的。它根本不应该编译。)
你应该这样做:
NSMutableArray *tmpArray = [dataSetArray mutableCopy];
for (int i=0; i<[dataSetArray count]; i++)
{
…
[tmpArray replaceObjectAtIndex:i withObject:tmpStr];
}
您应该真的获得一些关于对象和对象引用的额外知识。