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

Mar*_*eIV 15 var type-inference objective-c

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

ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();
Run Code Online (Sandbox Code Playgroud)

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

var foo = new ThisIsMyReallyLongFooClassName();
Run Code Online (Sandbox Code Playgroud)

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

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

cob*_*bal 14

是的,不是.

您可以使用id foo = ...哪个将始终有效,但您丢失了类型信息.

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

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

  • Objective-C对象引用是真正的指针,但它们不能通过`void*'分配而没有潜在的问题(这就是为什么ARC明确地阻止void*转换而不表达内存管理意图).许多ObjC程序员 - 包括我自己 - 因为复杂性和副作用而完全避免使用ObjC++.我们中的许多人都不认为运算符重载是一个特性.对于他自己的每个人,只需确保您的团队充分了解什么是不受限制的. (4认同)

ter*_*ory 6

现在有__auto_type。例如...

__auto_type test = @"Hello World";
Run Code Online (Sandbox Code Playgroud)

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

这是一篇不错的文章:

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

作者建议使用

#define let __auto_type const
#define var __auto_type
Run Code Online (Sandbox Code Playgroud)

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


das*_*ght 5

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

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


Kri*_*son 5

你可以这样做:

__typeof([obj someMethod]) foo = [obj someMethod];
Run Code Online (Sandbox Code Playgroud)

这很丑陋,但是如果您定义了一个片段或宏来自动生成它,那么您不必输入类型名称.例如:

#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];"
Run Code Online (Sandbox Code Playgroud)

注意:我不推荐这种方法,因为Objective-C中的约定是写出完整的类型名称或使用id,并且宏可能很混乱.但了解__typeof()可以很方便.