15

强烈支持在 C# 中使用 'var' 关键字来处理非常清楚的情况。例如,而不是这个...

ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();

我可以输入这个...

var foo = new ThisIsMyReallyLongFooClassName();

...而且我仍然有一个强类型变量。就所有意图和目的而言,两者都是平等的。后者更具可读性(同样,因为它很清楚。在某些情况下它不是并且不应该使用 'var'。但是我不希望这成为对此的讨论。)

我想知道Objective-C是否有类似的东西。

4

7 回答 7

14

是和不是。

您可以使用id foo = ...which will always work,但您会丢失类型信息。

如果你真的想要等效的东西,你可以auto foo = ...从 C++11 开始使用,但是你必须将你的文件编译为 Objective-C++,这有很多其他的副作用。

约定只是说明您的类型;这很烦人,但不像 C++、C#、Java 中的模板/泛型可以使类型名变得很长,它通常在 Objective-C 中是可以管理的。

于 2013-01-12T22:57:45.003 回答
5

不,Objective C 中没有等价物。C++11 引入了auto关键字来做到这一点,但是 C 和 Objective C 都没有类似的能力。

id最接近 C# 的关键字dynamic。它可以让您获得与 类似的结果var,只是它不允许您使用属性语法访问属性。它确实允许您调用方法,包括实现属性访问器的方法。

于 2013-01-12T22:57:30.800 回答
5

你可以这样做:

__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 中的约定是写出完整的类型名称或 use id,而宏可能会很混乱。但了解__typeof()可能会很方便。

于 2014-03-26T17:57:28.530 回答
5

现在有 __auto_type。例如...

__auto_type test = @"Hello World";

...导致测试的类型为 NSString*。

这是一篇不错的文章:

https://medium.com/@maicki/type-in​​ference-with-auto-type-55a38ef56372

作者建议使用

#define let __auto_type const
#define var __auto_type

在您的应用程序的某些共享标头中,以使使用更清晰。我个人对这种宏的使用有点警惕,但我已经做了一段时间了,世界仍在转动……也许宏名称不太可能引起冲突会更好。

于 2018-01-09T00:55:39.970 回答
4

Objective-C 中有id关键字,但注意它相当于dynamicC# 中的关键字,而不是var关键字。var是隐式类型 - 即类型是推断出来的,但它仍然是静态类型。dynamic并且id用于动态类型,并且您会丢失类型信息。

于 2013-01-12T22:58:55.253 回答
1

恐怕在 Objective C 中不存在这样的等价物,它可以让你保留强类型。

于 2013-01-12T22:57:00.217 回答
0

您可以在目标 C 中使用id关键字,但它不能用作 c#

在c#中

var stringVar = ...

stringVar用作字符串变量,您可以通过执行访问字符串函数stringVar.function

id stringVar = [NSString ...]

但它仍然可以作为正常的 id 类型使用。

于 2013-01-12T23:52:16.187 回答