Ответ 1
Не используйте sizeof. Используйте [names count]
.
У меня есть код, который требует использования цикла 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 *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;
}
}
У меня возникли проблемы, потому что каждый раз, когда эта функция вызывается из программы, она почти так же, как если бы имена "sizeof" были неправильными, поэтому проверяются не все значения в массиве. Я вообще-то программист на Java, поэтому я привык к names.length, и мне сказали, что имена sizeof - это, по сути, одно и то же... любая помощь?
Приветствия.
Не используйте sizeof. Используйте [names count]
.
Вы хотите использовать [names count] not sizeof names. Sizeof будет давать вам размер самого фактического указателя объекта имен, а не количество элементов, так как это тип динамической памяти.
Чтобы получить количество элементов, хранящихся в NSAarray
, вы должны использовать метод экземпляра count
, который возвращает NSUInteger
.
Альтернативно, вы можете перебирать эти элементы, используя цикл for in
, который доступен также на Java, если я правильно помню.
for (MyClass *element in myArray) {
NSLog(@"%@", element);
}
Обратите внимание, что sizeof
является оператором C, который возвращает размер в байтах своего операнда, поэтому он не говорит вам, сколько элементов хранится в NSArray
, но размер в байтах одного экземпляра NSArray.
Я знаю, что на ваш вопрос уже был дан ответ - но вот более Cocoa способ его написания
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;
}
Можно также использовать Fast Enumeration, в некоторых случаях это может быть более понятным для читателя:
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;
}