for(int i=0;i<[serviceNamesFilterArray count];i++){
NSLog(@"state : %@", [serviceNamesFilterArray objectAtIndex:i]);
NSString *str = [serviceNamesFilterArray objectAtIndex:i];
if (tag_id == [serviceNamesFilterArray indexOfObject:str] ) {
// filterButtonArray = serviceNamesFilterArray;
[filterButtonArray addObject:str];
NSLog(@"%@",filterButtonArray);
}
}
Я хочу получить доступ к индексу serviceNamesFilterArray. Как я могу получить доступ к индексу моего массива, чтобы сравнить его с целым числом tag_id?
вы можете сравнить значение i с вашим tag_id следующим образом:
for(int i=0;i<[serviceNamesFilterArray count];i++) {
NSLog(@"state : %@", [serviceNamesFilterArray objectAtIndex:i]);
NSString *str = [serviceNamesFilterArray objectAtIndex:i];
if (tag_id == i) {
//perform your logic here
}
}
вы можете использовать метод enumerateObjectsUsingBlock
, например
[serviceNamesFilterArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// ...
}];
Даже Objective-C предоставляет более интеллектуальные API фильтров, чем цикл.
index
будет содержать индекс объекта в массиве, соответствующем tag_id
NSInteger index = [self.serviceNamesFilterArray indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
return (NSString *)obj.integerValue == tag_id;
}];
Преамбула: вы используете [array objectAtIndex:index]
в своем коде, хотя исторически это был способ индексации в современном Objective-C, вы просто пишете array[index]
. Если вы изучаете Obj-C из книги/веб-сайта, возможно, вы захотите найти более новый текст.
Непонятно, о чем вы спрашиваете, давайте посмотрим, что мы можем выяснить.
Вы начинаете с цикла:
for(int i=0;i<[serviceNamesFilterArray count];i++)
Здесь i
будет использоваться как индекс в массиве serviceNamesFilterArray
. Затем внутри цикла вы получаете доступ к объекту по индексу i (обновляя код, как указано выше):
NSString *str = serviceNamesFilterArray[i];
и, получив объект с индексом i, вы спрашиваете, каков индекс этого объекта:
[serviceNamesFilterArray indexOfObject:str]
Здесь возможны два варианта ответа:
i — это самый очевидный ответ и будет результатом, если в serviceNamesFilterArray
нет дубликатов. Это будет ответ, как вы только что получили str
из индекса i массива.
j где j < i — это будет ответ, если в массиве есть дубликаты и одна и та же строка найдена по индексам j и i. Такой результат получается потому, что indexOfObject: возвращает первый индекс, по которому объект встречается в массиве.
Наиболее вероятным результатом в вашем случае будет (1) (при условии, что у вас нет повторяющихся «имен служб»). В этом случае ваше условие эквивалентно:
if (tag_id == i) {
[filterButtonArray addObject:str];
}
Однако, если это ваше намерение, цикл совершенно не нужен, поскольку ваш код эквивалентен:
NSString *str = serviceNamesFilterArray[tag_id];
[filterButtonArray addObject:str];
Если serviceNamesFilterArray
действительно содержит дубликаты, то ваш написанный код может добавить строку с индексом tag_id
несколько раз в filterButtonArray
или может добавить ее ни разу — мы оставим выяснение причин в качестве упражнения, и мы сомневаемся, что это ваше намерение в любом случае.
На момент написания @vadian сделал другое предположение относительно вашей цели. Их решение находит индекс, если он есть, где строковое значение, интерпретируемое как целое число, равно значению tag_id
(целое число). Если это ваша цель, решение @vadian обеспечит ее.
Конечно, и наши догадки, и предположения @vadian могут быть ошибочными относительно вашей цели. Если это так, вы можете отредактировать вопрос, чтобы объяснить, или удалить его и вместо этого задать новый — учитывая, что на момент написания этого вопроса уже было 3 ответа, удаление в этом случае может быть лучше, чтобы уменьшить путаницу в будущем, когда люди будут читать (исправлено) вопрос и (устаревшие) ответы.
ХТН
Возможно, вам просто нужно решить, меньше ли tag_id, чем количество serviceNamesFilterArray, тогда вы можете получить значение напрямую по tag_id.
if (tag_id < [serviceNamesFilterArray count]){
NSString *str = [serviceNamesFilterArray objectAtIndex:tag_id];
// other logic here
}
Что это
index of array
?