我怎么能有一个可以返回任何类型的方法/函数呢?例如,有时类型需要是float,有时需要是NSString*,这样id就不能工作了,因为float不是id。我不反对在c或c++函数中这样做,如果这样更容易的话。
我需要动态返回类型的原因是因为我使用objc/ get来获取Ivar。
我希望some_type能够做任何事情:
- (some_type)getIvarWithName:(const char *)name in:(id)obj
{
Ivar ivar(class_getInstanceVariable(object_getClass(obj),name));
return (some_type)ivar;
}发布于 2014-04-18 22:42:55
返回包装在NSNumber中的float,然后就可以使用id返回类型了。
为了简化它,您甚至可以使用装箱文字,例如:
return @(1.1f);发布于 2014-04-18 22:45:34
首先要考虑的是,为什么需要一个可以返回任何类型的函数。这真的没有意义,因为你不知道类型,所以你不能给任何东西赋值。当然,当严格处理Obj-C对象时,情况会有所不同,因为该语言使用带有id关键字的未知对象。未知物体就像是把蜜糖苹果和麦金塔苹果混在一起(没有双关语),而你想做的就像把蜜糖苹果和飞机混在一起!但是,如果您希望根据参数返回某个类型(例如,为int参数返回int,为float参数返回float ),则可以重载这些函数。否则,我所知道的唯一返回任何东西的方法就是一个空指针(void *)。这将指向一大块数据,实际上可以是任何东西。但回到最初的问题。它代表什么?它有多长时间?祝好运!
更新:正如其他答案所提到的,您可以包装简单的数据类型(int、float等)。在诸如NSNumbers或NSValues之类的对象中,这将适用于您的情况。但是,当扩展到具有复杂类型(如结构)的更一般的场景时,这些通常不能包装在内置类中。您需要使用Obj-C创建自己的类。
发布于 2014-04-18 22:49:31
Obj-C中没有这种多态性。如果你事先知道会返回什么,那么你当然可以使用to方法。当您使用NSNumber作为浮点值时,缩减id将会起作用。您甚至可以引入一个包含数字或字符串的响应对象,并为以后的处理提供(bool) isNumber和(bool) isString方法。
但你到底想做什么?你在什么背景下使用它,你真正想要实现的是什么。在我看来,似乎有更好的解决方案。
https://stackoverflow.com/questions/23156351
复制相似问题