Существует ли Objective-C эквивалент ключевого слова С# 'var'? - программирование
Подтвердить что ты не робот

Существует ли Objective-C эквивалент ключевого слова С# 'var'?

Огромный сторонник использования ключевого слова 'var' в С# для случаев, когда он очень ясен. Например, вместо этого...

ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();

Я могу напечатать это...

var foo = new ThisIsMyReallyLongFooClassName();

... и у меня все еще есть сильно типизированная переменная. Эти двое, по сути, равны. Последнее просто читаемо (опять же, потому что оно ясно. Есть случаи, когда это не так, и "var" не следует использовать. Я не хочу, чтобы это стало обсуждением этого.)

Мне интересно, имеет ли Objective-C что-то подобное.

4b9b3361

Ответ 1

Теперь существует __auto_type. Например...

__auto_type test = @"Hello World";

... приводит к тесту, имеющему тип NSString *.

Здесь приличная запись:

https://medium.com/@maicki/type-inference-with-auto-type-55a38ef56372

Автор предлагает использовать

#define let __auto_type const
#define var __auto_type

в каком-либо общем заголовке вашего приложения, чтобы сделать использование чище. Я немного настороженно отношусь к этому виду использования макросов, но я делал это некоторое время, и мир все еще поворачивается... Может быть, имена макросов менее вероятны, чтобы вызвать столкновение, было бы лучше.

Ответ 2

Да и нет.

Вы можете использовать id foo = ..., который всегда будет работать, но вы потеряете информацию о типе.

Если вы действительно хотите что-то эквивалентное, вы можете использовать auto foo = ... из С++ 11, но тогда вам нужно скомпилировать ваш файл как Objective-C ++, который имеет много других побочных эффектов.

Конвенция должна просто указывать ваши типы; это раздражает, но в отличие от С++, С#, Java, где шаблоны/дженерики могут сделать имена типов очень длинными, обычно они управляются в Objective-C.

Ответ 3

Нет, в Objective C. нет эквивалента. В С++ 11 было введено ключевое слово auto, но ни C, ни Objective C не имеют аналогичной возможности.

id ближе всего к ключевому слову С# dynamic. Он позволяет достичь аналогичных результатов с var, за исключением того, что он не позволяет вам получать доступ к свойствам с помощью синтаксиса свойств. Это позволяет вам вызывать методы, в том числе методы, реализующие устройства доступа к свойствам.

Ответ 4

Вы можете сделать что-то вроде этого:

__typeof([obj someMethod]) foo = [obj someMethod];

Это некрасиво, но если у вас есть фрагмент или макрос, предназначенные для его автоматической генерации, вам не нужно вводить имена типов. Например:

#define LET(V, EXPR) __typeof(EXPR) V = (EXPR)

LET(vc, self.viewController);  // equivalent to "UIViewController* vc = self.viewController;"
LET(d, [number doubleValue]);  // equivalent to "double d = [number doubleValue];"
LET(foo, [[Foo alloc] init]);  // equivalent to "Foo *foo = [[Foo alloc] init];"

Примечание. Я не рекомендую этот подход, так как соглашение в Objective-C заключается в том, чтобы записывать полные имена типов или использовать id, а макросы могут быть беспорядочными. Но знать о __typeof() может быть удобно.

Ответ 5

В Objective-C есть ключевое слово id, но обратите внимание, что оно эквивалентно ключевому слову dynamic в С#, а не ключевому слову var. var - это неявное типирование, т.е. тип выводится, но он по-прежнему является статическим. dynamic и id предназначены для динамического ввода текста, и вы теряете информацию о типе.

Ответ 6

Я боюсь, что такой эквивалент не существует в Objective C, который позволит вам сохранить сильную типизацию.

Ответ 7

В объекте C можно использовать ключевое слово id, но оно не работает как С#

в С#

var stringVar = ...

stringVar работал как строковая переменная, и вы можете использовать доступ к строковой функции, выполнив stringVar.function

id stringVar = [NSString ...]

но он по-прежнему работает как обычный тип id.