非常明确地支持在C#中使用'var'关键字。例如,而不是......
ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();
我可以输入这个......
var foo = new ThisIsMyReallyLongFooClassName();
...我仍然有一个强类型的变量。出于所有意图和目的,这两者是平等的。后者只是更具可读性(同样,因为它很清楚。有些情况下它不是,并且'var'不应该被使用。但我不希望这成为对它的讨论。)
我想知道Objective-C是否有类似的东西。
答案 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
是隐式类型 - 即推断类型,但它仍然是静态类型。 dynamic
和id
用于动态输入,您会丢失类型信息。
答案 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类型。