目标C中C#中的对象的等价物是什么?

问题描述:

在c#我可以声明object o;然后我可以分配o=(float)5.0;o="a string."是否有Objective-C的等价物?我试图使用id,但它不采用像float或integer这样的基本类型。感谢您的帮助。目标C中C#中的对象的等价物是什么?

+0

'可以'并不意味着'应该';对象的*使用可能会导致运行时错误,这些错误可能在编译时使用更具体的类型来捕获。 – 2010-05-28 09:44:42

+0

我相信我不是唯一需要这个人的人。原因是我正在开发一个平台。我试图在我的最后做更多的工作,所以我的客户会少做。 – 2010-05-29 11:33:23

Objective-C没有CLR中的“统一类型系统”。换句话说,作为C的一个超集,Objective-C的基本类型与对象实例完全不同的是百兽。 id类型可以将引用(OS X/iPhone Objective-C运行时中的真正指针)存储到任何对象实例。 C的原始类型(例如int,float等)必须被包装在NSValueNSNumber中,以被分配到类型id。当然,这正是C#编译器正在做的。这只是在C#中,你不必显式地进行(un)boxing转换。

很快,像

float val; 
id obj = [NSNumber numberWithFloat:val]; 
... 
float v = [obj floatValue]; 

代码将成为第二天性,如果按现代标准遗憾的是冗长。

+0

谢谢巴里。我最终完成了你的建议。由于我需要在数组中存储c类型数据的混合包,因此一旦将数据类型转换为NSNumber,就可以轻松地检测数据类型了吗? – 2010-05-29 11:52:12

+0

'NSNumber'是'NSValue'的一个子类,所以你可以使用'-objCType'和C字符串比较来确定实际的数字类型...很漂亮的老派,但它的工作原理。 Objectie-C希望感受到动态类型和C的静态类型相互冲突的情况。 – 2010-05-30 05:24:22

有没有真的这样的事情。您可以使用NSNumberNSValue将原生数据类型处理为对象。 NSString会做字符串。您可以将所有这些分配给一个id类型变量,但您需要使用正确的类init方法创建它们。

你是对的,id只适用于ObjC对象引用。如果你想引用一个带有id引用的int,你需要把它放入一个NSNumber。顺便提一下,C#也是对这些原语进行装箱,它只是自动进行。

回到我的日子,我们不得不在冰雪上行走15英里,上山,使用void pointers。哦,我们没有*!

+0

不回答这个问题,但我喜欢它:) – Ben 2010-05-27 23:25:28

+0

我喜欢这个,但我必须-1因为不回答这个问题。 (尝试制作CW,然后我会调高它) – OscarRyz 2010-05-28 02:30:09

+0

+1因为世界是一个更好的地方,有一些幽默感。 – JeremyP 2010-05-28 07:29:02

实际上,C#数据类型只是它们各自类的别名,这就是它们可以分配给对象类型的原因。例如,int实际上是一个名为Int32的类。

正如前面提到的@Barry,Objective-C的情况并非如此。