开发者

Typecasting return value of methods when returned value is parent class of the typecast?

I have code similar to this.

MySubclassOfUIView *view = [aUIPickerView viewForRow:4 forComponent:0];

The viewForRow:forComponent method of UIPickerView returns a UIView. MySubclassOfUIView is exactly that: a subclass of UIView.

The UIPickerView delegate (not mentioned here) uses an array of MySubclassOfUIView objects to populate the rows of the UIPickerView components. Thus, I know the viewForRow:forComponent method is really going to be returning a pointer to an object of type MySubclassOfUIView.

Xcode gives me this warning.

Incompatible pointer types initializing 'MySubclassOfUIView*' with an expression of type 'UIView*'.

So I figure that I'll typecast it to fix the warning, which gives me this code.

MySubclassOfUIView *view = (MySubclassOfUIView*)[aUIPickerView viewForRow:4 forComponent:0];

And the warning goes away.

Please forgive my shaky C and Objective-C skills, but am I doing the right thing (as far as the context given so far)? Is there some other better way to开发者_如何学JAVA handle this situation?


If you are absolutely sure that it will return a MySubclassOfUIView, then it is OK to do this. If there is any chance that it could return something else (such as you made a mistake and added the wrong thing to the array), then you should check the type and use a temporary variable.

UIView *temp = [aUIPickerView viewForRow:4 forComponent:0];
NSAssert([temp isMemberOfClass:[MySubclassOfUIView class]],[NSString stringWIthFormat:@"aUIPickerView returned the wrong class (%@)",[temp class]]);
MySubclassOfUIView *theView = (MySubclassOfUIView*)temp;


What you can do is:

MySubclass* subFoo = [[MySubclass alloc] init];
MySuperclass* superFoo = subFoo;

What you shouldn't do is:

MySuperclass* superFoo = [[MySuperclass alloc] init];
MySubclass* subFoo = superFoo;

This is, because your Subclass will have all properties, selectors, etc from the Superclass. But the Superclass won't have all (..) of the Subclass.

For the rest, see ughoavgfhw's answer.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜