КЛИСТЫ в Цели C
У меня есть код cpp, где объекты структуры помещаются в CLISTS
, Я портирую этот код в цель C.
CLIST похож на двусвязный список с .RemoveAt
, .GetAt
, .InsertBefore
, .GetNext
, .GetHeadPosition
функции.
Как реализовать то же самое в Objective C
, Нужно ли реализовывать двусвязный список в Objective C. Есть ли другие предопределенные методы для его использования.
1 ответ
CLIST предположительно круговой? Следовательно GetHeadPosition
?
В любом случае, NSArray
(или же, NSMutableArray
в этом случае, поскольку вы хотите вставить), это обычный способ сохранить упорядоченные списки в Objective-C.
За RemoveAt
использовать removeObjectAtIndex:
, За GetAt
использовать objectAtIndex:
, За InsertBefore
Вы, вероятно, захотите написать что-то вроде:
- (void)insert:(id)objectToInsert before:(id)referenceObject
{
int index = [array indexOfObject:referenceObject];
if(index == NSNotFound) return; // or whatever you'd expect.
// Maybe object is just inserted at the end?
index = index - 1;
if(index < 0) index = [array count];
[array insertObject:objectToInsert atIndex:index];
}
(что, вероятно, будет лучше в категории NSArray, но вы получите точку)
За GetNext
а также GetHeadPosition
Вы, вероятно, хотите сохранить позицию массива в отдельной переменной. Итак, для GetNext:
arrayPosition = (arrayPosition + 1)%[array count];
return [array objectAtIndex:arrayPosition];
А для GetHeadPosition просто:
return arrayPosition;
РЕДАКТИРОВАТЬ: для итерации NSArray, самый простой способ на самом деле игнорировать что-либо явное и просто использовать:
for(ObjectType *object in array)
{
/* do something with object */
}
Как правило, это означает, что вам на самом деле не нужен аналог GetNext, но вы не можете изменить массив во время этого цикла, поэтому его не всегда можно использовать.