Существует ли Objective-C эквивалент ключевого слова С# 'var'?
Огромный сторонник использования ключевого слова 'var' в С# для случаев, когда он очень ясен. Например, вместо этого...
ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();
Я могу напечатать это...
var foo = new ThisIsMyReallyLongFooClassName();
... и у меня все еще есть сильно типизированная переменная. Эти двое, по сути, равны. Последнее просто читаемо (опять же, потому что оно ясно. Есть случаи, когда это не так, и "var" не следует использовать. Я не хочу, чтобы это стало обсуждением этого.)
Мне интересно, имеет ли Objective-C что-то подобное.
Ответы
Ответ 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.