- у меня должно быть разумное количество возможных комбинаций (скажем, 1M)
- , код должен быть максимально коротким, для предотвращения ошибок от пользователя
ну, если Вы хотите, чтобы он имел по крайней мере один миллион комбинаций, тогда Вам нужны по крайней мере шесть цифр. Это достаточно коротко?
1. NSString *string;
2. NSString * string;
3. (NSString *) string;
4. NSString* string;
1, 2 и 4 полностью идентичны. Все в стиле. Выбирайте все, что хотите, или смешивайте.
Вариант №3 имеет и другое значение, он используется при кастинге. Например:
t = (NSString *)string ;
приведет к преобразованию строки
в указатель NSString
.
Но вариант №3 - это синтаксис, который вы, вероятно, использовали бы в файле .h или в определении функции в файле .m. Внутри реальной функции, в коде, который «запускается», это имеет другое значение.
Нет никакой разницы - это вопрос стиля. Все они объявляют переменную с именем string
, которая является указателем на NSString. Скобки необходимы в некоторых контекстах (особенно в объявлениях методов), чтобы пояснить, что это объявление типа.
не имеет значения, куда вы поместите звездочку, все операторы создают указатели типа NSString.
при использовании нескольких имен переменных в одной строке вы должны написать звездочку для каждой переменной, хотя .
NSString * nsstring, * nsstring2;
1, 2 и 4 эквивалентны и определяют указатель на NSString. Мое личное предпочтение - как можно больше подражать K&R, поэтому я предпочитаю использовать NSString * string;
(NString *) string;
хотя и допустимый оператор, на самом деле ничего не делает сам по себе.
$ cat foo.m
#include <Cocoa/Cocoa.h>
void foo()
{
NSString *string;
(NSString*) string; // doesn't do anything
42; // doesn't do anything either
}
$ gcc -Wall -c foo.m
foo.m: In function 'foo':
foo.m:7: warning: statement with no effect
foo.m:8: warning: statement with no effect
на самом деле все равнозначно: указатель на nsstring !!
1. NSString *string;
2. NSString * string;
3. (NSString *) string;
4. NSString* string;
1,2 и 4 эквивалентны. Язык C (и надмножество C Objective-C) определяют синтаксис, нечувствительный к пробелам. Таким образом, вы можете свободно добавлять места, где захотите, исходя из стиля. Весь соответствующий синтаксис ограничен непробельными символами (например, {
, }
, ;
и т. Д.) [1].
3 либо приведение типа (указание компилятору C использовать тип NSString *
независимо от объявленного типа string
. В Objective-C приведение типов экземпляров объектов требуется редко. Вы можете использовать тип id
для переменных, которые могут ссылаться на экземпляры любого типа объекта.
В объявлениях методов синтаксис 3 (иногда без конечной точки с запятой) используется для объявления типа параметров метода. Метод Objective-C может выглядеть следующим образом:
- (void)myMethodThatTakesAString:(NSString*)string;
В этом объявлении тип аргумента с именем строка
- это тип NSString *
(ведущий -
указывает метод экземпляра в отличие от метода класса). Объявление метода с более чем одним параметром может выглядеть так:
- (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam;
[1] Это сравнивается с такими языками, как Python, которые используют пробелы в качестве разделителя блоков.
Нет никакой разницы, однако вы должны знать, что только первый «токен» (так сказать) определяет имя типа, а * не является частью имени типа. То есть:
NSString *aString, bString;
Создает один указатель на- NSString
и один NSString
. Чтобы оба были указателями, выполните:
NSString *aString, *bString;
или:
NSString *aString;
NSString *bString;
Нет никакой разницы, где *
помещается в объявление указателя, не имеет значения.
Нет абсолютно никакой разницы. NSString * mystring и NSString * myString идентичны.
* работает так же, как и в стандартном C.
это хороший учебник по размещению * в разных местах и о том, что он делает: http://boredzo.org/pointers/