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中管理.
现在有__auto_type。例如...
__auto_type test = @"Hello World";
Run Code Online (Sandbox Code Playgroud)
...导致测试的类型为 NSString*。
这是一篇不错的文章:
https://medium.com/@maicki/type-inference-with-auto-type-55a38ef56372
作者建议使用
#define let __auto_type const
#define var __auto_type
Run Code Online (Sandbox Code Playgroud)
在应用程序的某些共享标头中,以使使用更清晰。我个人对这种宏的使用有点警惕,但我已经这样做了一段时间了,世界仍在转动……也许宏名称不太可能引起冲突会更好。
不,目标C中没有等价物.C++ 11引入了auto关键字来执行此操作,但C和Objective C都没有相似的功能.
该id最接近C#的dynamic关键字.它允许您实现类似的结果var,除了它不允许您使用属性语法访问属性.它允许您调用方法,包括实现属性访问器的方法.
你可以这样做:
__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()可以很方便.
| 归档时间: |
|
| 查看次数: |
4794 次 |
| 最近记录: |