Размещение звездочки в Objective C

  • у меня должно быть разумное количество возможных комбинаций (скажем, 1M)
  • , код должен быть максимально коротким, для предотвращения ошибок от пользователя

ну, если Вы хотите, чтобы он имел по крайней мере один миллион комбинаций, тогда Вам нужны по крайней мере шесть цифр. Это достаточно коротко?

53
задан Suragch 2 February 2015 в 01:44
поделиться

12 ответов

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

1, 2 и 4 полностью идентичны. Все в стиле. Выбирайте все, что хотите, или смешивайте.

Вариант №3 имеет и другое значение, он используется при кастинге. Например:

t = (NSString *)string ;

приведет к преобразованию строки в указатель NSString .

Но вариант №3 - это синтаксис, который вы, вероятно, использовали бы в файле .h или в определении функции в файле .m. Внутри реальной функции, в коде, который «запускается», это имеет другое значение.

23
ответ дан 7 November 2019 в 08:34
поделиться

Нет никакой разницы - это вопрос стиля. Все они объявляют переменную с именем string , которая является указателем на NSString. Скобки необходимы в некоторых контекстах (особенно в объявлениях методов), чтобы пояснить, что это объявление типа.

19
ответ дан 7 November 2019 в 08:34
поделиться

не имеет значения, куда вы поместите звездочку, все операторы создают указатели типа NSString.

при использовании нескольких имен переменных в одной строке вы должны написать звездочку для каждой переменной, хотя .

NSString * nsstring, * nsstring2;
6
ответ дан 7 November 2019 в 08:34
поделиться

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
2
ответ дан 7 November 2019 в 08:34
поделиться

на самом деле все равнозначно: указатель на nsstring !!

3
ответ дан 7 November 2019 в 08:34
поделиться
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, которые используют пробелы в качестве разделителя блоков.

6
ответ дан 7 November 2019 в 08:34
поделиться

Нет никакой разницы, однако вы должны знать, что только первый «токен» (так сказать) определяет имя типа, а * не является частью имени типа. То есть:

NSString *aString, bString;

Создает один указатель на- NSString и один NSString . Чтобы оба были указателями, выполните:

NSString *aString, *bString;

или:

NSString *aString;
NSString *bString;
32
ответ дан 7 November 2019 в 08:34
поделиться

Без разницы, размещение пробелов не имеет значения.

4
ответ дан 7 November 2019 в 08:34
поделиться

Нет никакой разницы, где * помещается в объявление указателя, не имеет значения.

5
ответ дан 7 November 2019 в 08:34
поделиться

Между ними нет абсолютно никакой разницы.

3
ответ дан 7 November 2019 в 08:34
поделиться

Нет абсолютно никакой разницы. NSString * mystring и NSString * myString идентичны.

4
ответ дан 7 November 2019 в 08:34
поделиться

* работает так же, как и в стандартном C.

это хороший учебник по размещению * в разных местах и ​​о том, что он делает: http://boredzo.org/pointers/

3
ответ дан 7 November 2019 в 08:34
поделиться