Xcode: количество элементов в массиве строк

Есть ли быстрый способ получить количество строк в массиве NSString?

NSString *s[2]={@"1", @"2"}

Я хочу получить из этого длину 2. У меня есть что-то вроде (s.size). Я знаю, что есть метод -length, но это для строки, а не для массива строк. Я новичок в Xcode, пожалуйста, будьте нежны.


person Vlad Otrocol    schedule 23.02.2012    source источник


Ответы (3)


Используйте NSArray.

NSArray *stringArray = [NSArray arrayWithObjects:@"1", @"2", nil];
NSLog(@"count = %d", [stringArray count]);
person beryllium    schedule 23.02.2012
comment
Да, в конце я буду использовать изменяемый массив. Но просто из любопытства. Неужели нет способа получить эту длину? - person Vlad Otrocol; 23.02.2012
comment
На самом деле вам следует использовать [stringArray count], так как это метод экземпляра, а не свойство. - person Rengers; 23.02.2012
comment
@Rengers Это не имеет никакого значения. Свойство только для чтения точно такое же, как метод экземпляра. - person Sulthan; 23.02.2012
comment
@Rengers, граф - добытчик. Может использоваться как недвижимость - person beryllium; 23.02.2012
comment
Я знаю, что это не имеет никакого значения. Просто это неправильная привычка вызывать методы, используя нотацию свойств ;). - person Rengers; 23.02.2012
comment
Да, геттер и сеттер. В любом случае, вызывать метод экземпляра, как если бы он был определен как свойство IMHO, по-прежнему плохая практика. - person Rengers; 23.02.2012
comment
@Rengers, запись через точку не имеет ничего общего со свойством. Это альтернативный способ вызова методов. Да, он был создан из-за свойств, но, независимо от вашего мнения, неплохо использовать его для методов, которые не были синтезированы из свойства. В большинстве случаев вам придется искать заголовки классов, чтобы узнать, как объявляется метод. - person Sulthan; 23.02.2012
comment
Я знаю, что это просто синтаксический сахар. Но что, если я создам метод с именем login, который делает кучу вещей, связывается с сервером и переворачивает представление, когда закончит. Это плохая практика, чтобы вызвать это, используя foo.login? Это работает правильно? ИМХО, пока в документах это указано как метод экземпляра, вы должны вызывать его как метод экземпляра. Но эй, разные люди, разные стили :). - person Rengers; 23.02.2012
comment
Если я предполагаю, что login имеет сигнатуру -(id)login, что было бы довольно странно для такого метода, то его название говорит о том, что это не геттер, и тогда не следует использовать точечную нотацию. Вы бы назвали это точечной нотацией, если кто-то добавит @property (nonatomic, readonly) id login в класс? - person Sulthan; 23.02.2012

Да, есть способ. Обратите внимание, что это работает только в том случае, если массив не создается динамически с использованием malloc.


NSString *array[2] = {@"1", @"2"}

//size of the memory needed for the array divided by the size of one element.
NSUInteger numElements = (NSUInteger) (sizeof(array) / sizeof(NSString*));

Этот тип массива типичен для C, и поскольку Obj-C является надмножеством C, его можно использовать. Только надо быть особенно осторожным.

person Sulthan    schedule 23.02.2012

Пытался найти _countf в target-c, но кажется, что он не существует, поэтому, предполагая, что операторы sizeof и typeof работают правильно, и вы передаете действительный массив c, тогда может работать следующее.

#define _countof( _obj_ ) ( sizeof(_obj_) / (sizeof( typeof( _obj_[0] ))) )

NSString *s[2]={@"1", @"2"} ;
NSInteger iCount = _countof( s ) ;
person redwud    schedule 29.12.2013