Objective c 获取数组的大小
我有一些代码需要使用for循环从数组中读取变量Objective c 获取数组的大小,objective-c,arrays,sizeof,Objective C,Arrays,Sizeof,我有一些代码需要使用for循环从数组中读取变量 int size=sizeof names; NSLog(@"thelast one is %d",size); NSString *usersName=userName.text; NSString *usersPass=passWord.text; for (i=0; i<=size;i++){ NSString *namesArray=[names objectAtIndex:i]; NSString *passArr
int size=sizeof names;
NSLog(@"thelast one is %d",size);
NSString *usersName=userName.text;
NSString *usersPass=passWord.text;
for (i=0; i<=size;i++){
NSString *namesArray=[names objectAtIndex:i];
NSString *passArray=[pass objectAtIndex:i];
NSLog(@"namesArray %@",namesArray);
NSLog(@"passArray %@",passArray);
if([namesArray isEqualToString:usersName]){
userValid=1;
NSLog(@"The content of arry4 is %@",namesArray);
}
if([passArray isEqualToString:usersPass]){
passValid=1;
NSLog(@"The content of arry4 is %@",passArray);
}
else {
userValid=0;
passValid=0;
}
}
int size=sizeof name;
NSLog(@“最后一个是%d”,大小);
NSString*usersName=userName.text;
NSString*usersPass=passWord.text;
对于(i=0;i不使用sizeof。使用[names count]
您要使用[names count]不是sizeof names。sizeof将提供实际名称对象指针本身的大小,而不是元素数,因为它是动态内存类型。要获取存储在NSARRAY
中的元素数,应使用实例方法count
,该方法返回NSInteger
或者,您可以使用for in
循环迭代这些元素,如果我没有记错的话,Java中也提供了该循环
for (MyClass *element in myArray) {
NSLog(@"%@", element);
}
请注意,sizeof
是一个C运算符,它返回其操作数的字节大小,因此它不会告诉您该NSArray
中存储了多少元素,而是一个NSArray实例的字节大小。我知道您的问题已经得到了回答,但这里有一种更简单的编写方法
NSString *userName = userName.text;
NSString *userPass = passWord.text;
// Use a block enumerator
NSUInteger nameIdx = [names indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
return ([obj isEqualToString:userName]);
}];
// Is the name in the array
if (nameIdx == NSNotFound) {
// Name not in array - so set to zero
userValid = 0;
passValid = 0;
} else {
userValid = 1;
// See if the corresponding password is correct
NSString password = [pass objectAtIndex:nameIdx];
if (![password isEqualToString:userPass]) {
passValid = 0;
} else {
passValid = 1;
}
还可以使用快速枚举,在某些情况下,读者可以更清楚地看到:
NSString *userName = userName.text;
NSString *userPass = passWord.text;
BOOL userValid = NO;
BOOL passValid = NO;
int index = 0;
for (NSString *eachName in namesArray) {
if ([eachName isEqualToString:userName) {
userValid = YES:
if ([[passArray objextAtIndex:index] isEqualToString:passWord) {
passValid = YES;
}
break;
}
index += 1;
}
使用NSDictionary而不是两个保存用户名和相应密码的数组不是更好吗?您没有一个break
。这意味着,如果在有效名称后面有任何其他名称,那么循环将继续运行,并对userValid
和userPass
的值进行筛选。并且,您的命名不正确直观-你有namesArray
,它包含一个字符串,等等-这使你的代码更难阅读…当然,你没有将密码存储为纯文本。对吗?对吗?!?这种方法的问题是,你没有索引。而且,由于他在不同的数组中有密码,没有索引,他无法匹配如果他使用字典,他可以使用快速枚举。