是否有一个Objective-C等同于C#的'var'关键字?

时间:2013-01-12 22:50:08

标签: objective-c var type-inference

非常明确地支持在C#中使用'var'关键字。例如,而不是......

ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();

我可以输入这个......

var foo = new ThisIsMyReallyLongFooClassName();

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

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

7 个答案:

答案 0 :(得分:14)

是和否。

您可以使用始终有效的id foo = ...,但会丢失类型信息。

如果你真的想要相同的东西,你可以使用C ++ 11中的auto foo = ...,但是你必须将你的文件编译为Objective-C ++,它有许多其他的副作用。

惯例就是拼出你的类型;它很烦人,但与C ++,C#,Java不同,模板/泛型可以使类型名很长,它通常可以在Objective-C中管理。

答案 1 :(得分:5)

不,目标C中没有等价物.C ++ 11引入了auto关键字来执行此操作,但C和Objective C都没有相似的功能。

id最接近C#的dynamic关键字。它允许您实现与var类似的结果,除了它不允许您使用属性语法访问属性。它允许您调用方法,包括实现属性访问器的方法。

答案 2 :(得分: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中的约定是写出完整的类型名称或使用id,并且宏可能很混乱。但了解__typeof()可能很方便。

答案 3 :(得分:4)

Objective-C中有id个关键字,但请注意它与C#中的dynamic关键字相同,而不是var关键字。 var是隐式类型 - 即推断类型,但它仍然是静态类型。 dynamicid用于动态输入,您会丢失类型信息。

答案 4 :(得分:2)

我担心在Objective C中没有这样的等价物可以让你保持强烈的打字。

答案 5 :(得分:2)

现在有__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

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

答案 6 :(得分:0)

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

在c#

var stringVar = ...

stringVar作为字符串变量工作,您可以通过执行stringVar.function

来访问字符串函数
id stringVar = [NSString ...]

但它仍然可以作为普通的id类型。