目标C中C#中的对象的等价物是什么?
在c#我可以声明object o;
然后我可以分配o=(float)5.0;
或o="a string."
是否有Objective-C的等价物?我试图使用id
,但它不采用像float或integer这样的基本类型。感谢您的帮助。目标C中C#中的对象的等价物是什么?
Objective-C没有CLR中的“统一类型系统”。换句话说,作为C的一个超集,Objective-C的基本类型与对象实例完全不同的是百兽。 id
类型可以将引用(OS X/iPhone Objective-C运行时中的真正指针)存储到任何对象实例。 C的原始类型(例如int
,float
等)必须被包装在NSValue
或NSNumber
中,以被分配到类型id
。当然,这正是C#编译器正在做的。这只是在C#中,你不必显式地进行(un)boxing转换。
很快,像
float val;
id obj = [NSNumber numberWithFloat:val];
...
float v = [obj floatValue];
代码将成为第二天性,如果按现代标准遗憾的是冗长。
谢谢巴里。我最终完成了你的建议。由于我需要在数组中存储c类型数据的混合包,因此一旦将数据类型转换为NSNumber,就可以轻松地检测数据类型了吗? – 2010-05-29 11:52:12
'NSNumber'是'NSValue'的一个子类,所以你可以使用'-objCType'和C字符串比较来确定实际的数字类型...很漂亮的老派,但它的工作原理。 Objectie-C希望感受到动态类型和C的静态类型相互冲突的情况。 – 2010-05-30 05:24:22
有没有真的这样的事情。您可以使用NSNumber
或NSValue
将原生数据类型处理为对象。 NSString
会做字符串。您可以将所有这些分配给一个id
类型变量,但您需要使用正确的类init
方法创建它们。
你是对的,id
只适用于ObjC对象引用。如果你想引用一个带有id引用的int,你需要把它放入一个NSNumber
。顺便提一下,C#也是对这些原语进行装箱,它只是自动进行。
实际上,C#数据类型只是它们各自类的别名,这就是它们可以分配给对象类型的原因。例如,int实际上是一个名为Int32的类。
正如前面提到的@Barry,Objective-C的情况并非如此。
'可以'并不意味着'应该';对象的*使用可能会导致运行时错误,这些错误可能在编译时使用更具体的类型来捕获。 – 2010-05-28 09:44:42
我相信我不是唯一需要这个人的人。原因是我正在开发一个平台。我试图在我的最后做更多的工作,所以我的客户会少做。 – 2010-05-29 11:33:23