gpt4 book ai didi

objective-c - 从 objective-c 方法返回 id 时我是否应该强制转换?

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:02 26 4
gpt4 key购买 nike

对于 Objective-C 专家:

假设我有一个像这样的简单方法:

-(id)getValue{ return [NSNumber numberWithDouble:5.0]; }

现在,假设在其他一些方法中,我像这样调用 (id)getValue 方法:

NSNumber* myValue = [self getValue];

或者如果我这样调用它会怎样:

NSNumber* myValue = (NSNumber*)[self getValue];

问题是:显然这些行是等价的,但其中一行使用了显式转换。那么这样做的正确或最佳实践方法是什么。对我来说,转换是不必要的,因为当它被放置在指针 myValue 中时,无论如何它在这一点上都是类型安全的(这是我想要的)所以转换基本上是没有意义的。

让我补充一点,我相信人们会指出:你为什么不直接从 getValue 方法返回 (NSNumber*) 但在我的例子中,我希望能够灵活地返回任何我想要的东西,就像内置 NSDictionary 类在您调用时返回 id:objectForKey 因为它允许您在其中放置任何类型的 NSObject 或子类。换句话说,我的 getValue 方法不会总是返回一个 NSNumber。还认为这个例子是人为的,因为我只关心是否转换。

提前谢谢你,

-拉尔夫

最佳答案

转换对象的唯一原因是让编译器满意。 (有时它也有助于提高可读性。)例如,当直接对要从数组或字典中获取的对象进行属性访问时,您必须强制转换:

((Foo *)[myArray objectAtIndex:0]).bar;

如果您不进行转换,编译器将无法进行属性查找,并且会报错。

当您从返回 id 的方法中获取对象时,编译器不可能知道它的实际类型是什么。实际上没有任何“类型安全”,因为 id 是一个通用指针;所有编译器可以并且将强制执行的是该方法说它返回一些 Objective-C 对象。很高兴将通用指针分配给任何类型化的指针。*(这实际上是容器的一个优势,显然。)因为您分配给的变量类型已经记录了实际返回类型,我会说不需要强制转换。

顺便说一句,你不应该调用你的方法getX。这在 Cocoa 中有特定的含义; “获取”某些东西的方法将指针传递给一个指针,然后由该方法填充该指针。参见 -[NSArray getObjects:range:]举个例子。


*该类型将在运行时强制执行,当然,发送对象未响应的消息会导致错误。

关于objective-c - 从 objective-c 方法返回 id 时我是否应该强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com