首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可变回报类型Objective-C或C

可变回报类型Objective-C或C
EN

Stack Overflow用户
提问于 2014-04-18 22:40:23
回答 5查看 142关注 0票数 0

我怎么能有一个可以返回任何类型的方法/函数呢?例如,有时类型需要是float,有时需要是NSString*,这样id就不能工作了,因为float不是id。我不反对在c或c++函数中这样做,如果这样更容易的话。

我需要动态返回类型的原因是因为我使用objc/ get来获取Ivar。

我希望some_type能够做任何事情:

代码语言:javascript
运行
复制
- (some_type)getIvarWithName:(const char *)name in:(id)obj
{
Ivar ivar(class_getInstanceVariable(object_getClass(obj),name));
return (some_type)ivar;
}
EN

回答 5

Stack Overflow用户

发布于 2014-04-18 22:42:55

返回包装在NSNumber中的float,然后就可以使用id返回类型了。

为了简化它,您甚至可以使用装箱文字,例如:

代码语言:javascript
运行
复制
return @(1.1f);
票数 3
EN

Stack Overflow用户

发布于 2014-04-18 22:45:34

首先要考虑的是,为什么需要一个可以返回任何类型的函数。这真的没有意义,因为你不知道类型,所以你不能给任何东西赋值。当然,当严格处理Obj-C对象时,情况会有所不同,因为该语言使用带有id关键字的未知对象。未知物体就像是把蜜糖苹果和麦金塔苹果混在一起(没有双关语),而你想做的就像把蜜糖苹果和飞机混在一起!但是,如果您希望根据参数返回某个类型(例如,为int参数返回int,为float参数返回float ),则可以重载这些函数。否则,我所知道的唯一返回任何东西的方法就是一个空指针(void *)。这将指向一大块数据,实际上可以是任何东西。但回到最初的问题。它代表什么?它有多长时间?祝好运!

更新:正如其他答案所提到的,您可以包装简单的数据类型(intfloat等)。在诸如NSNumbers或NSValues之类的对象中,这将适用于您的情况。但是,当扩展到具有复杂类型(如结构)的更一般的场景时,这些通常不能包装在内置类中。您需要使用Obj-C创建自己的类。

票数 1
EN

Stack Overflow用户

发布于 2014-04-18 22:49:31

Obj-C中没有这种多态性。如果你事先知道会返回什么,那么你当然可以使用to方法。当您使用NSNumber作为浮点值时,缩减id将会起作用。您甚至可以引入一个包含数字或字符串的响应对象,并为以后的处理提供(bool) isNumber(bool) isString方法。

但你到底想做什么?你在什么背景下使用它,你真正想要实现的是什么。在我看来,似乎有更好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23156351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档