当变量已经定义类型时,为什么需要进行类型转换?

Log*_*Rex 0 casting objective-c

我有一个自定义的UIViewController,我用它作为popover的内容视图控制器.这个自定义UIViewController定义如下...

@interface MyCustomViewController : UIViewController <MyCustomDelegate>
Run Code Online (Sandbox Code Playgroud)

然后我在另一个类中有一个方法,我引用popover的contentViewController就像这样...

-(void)someMethod:(UIPopoverController *)popoverController

    UIViewController<MuCustomDelegate> *theCustomViewController;
Run Code Online (Sandbox Code Playgroud)

因为我已经定义了什么theCustomViewController,为什么我必须在下一行之后做到这一点...

theCustomViewController = (UIViewController<MyCustomDelegate>*)myUIPopOverController.contentViewController;
Run Code Online (Sandbox Code Playgroud)

为什么编译器/ XCode编辑器或者其他任何东西都不知道代理是什么而不是让我在我已经定义它之后对其进行转换

谢谢

rma*_*ddy 5

根据您的更新,您询问是否需要投射myUIPopOverController.contentViewController.

简单 - 该contentViewController属性有一种类型UIViewController *.您不能将其直接分配给类型的变量UIViewController<MuCustomDelegate> *.

添加协议意味着您需要特定类型的协议UIViewController.编译器不能只假设contentViewController碰巧是这样的值.所以你使用演员告诉编译器,"相信我,我知道它到底是什么".