Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当从objective-c方法返回id时,我是否应该强制转换?_Objective C - Fatal编程技术网

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

当从objective-c方法返回id时,我是否应该强制转换?,objective-c,Objective C,对于Objective-C专家: 假设我有这样一个简单的方法: -(id)getValue{ return [NSNumber numberWithDouble:5.0]; } NSNumber* myValue = [self getValue]; 现在,假设在其他方法中,我调用(id)getValue方法,如下所示: -(id)getValue{ return [NSNumber numberWithDouble:5.0]; } NSNumber* myValue = [self ge

对于Objective-C专家:

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

-(id)getValue{ return [NSNumber numberWithDouble:5.0]; }
NSNumber* myValue = [self getValue];
现在,假设在其他方法中,我调用(id)getValue方法,如下所示:

-(id)getValue{ return [NSNumber numberWithDouble:5.0]; }
NSNumber* myValue = [self getValue];
或者如果我这样称呼它呢:

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

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

提前谢谢大家,


-拉尔夫强制转换对象的唯一原因是为了让编译器满意。(有时也有助于可读性。)例如,在直接对从数组或字典中获取的对象进行属性访问时,必须强制转换:

((Foo *)[myArray objectAtIndex:0]).bar;
如果您不执行强制转换,编译器将无法执行属性查找,并且会抱怨

当从返回
id
的方法获取对象时,编译器不可能知道其实际类型。实际上没有任何“类型安全”,因为
id
是一个通用指针;编译器能够并且将要执行的就是,该方法表示它返回某个Objective-C对象。将泛型指针分配给任何类型的指针都是非常好的。*(这显然是容器的一个优势。)因为您分配给的变量类型已经记录了实际的返回类型,所以我认为不需要强制转换

另外,您不应该调用您的方法
getX
。在可可中有特定含义;“获取”某物的方法将指针传递到指针,然后由该方法填充。请看一个例子



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

另请参见:注意,您不应该使用
getValue
方法;它应该是
get
作为前缀在Cocoa中表示非常特定的内容;一些参数将通过引用返回。感谢bbum和Josh Caswell指出避免使用带有get前缀的方法的建议。我肯定会重写我的一些方法。