投射是否有一般规则?
到目前为止,当我希望对象属于我创建的自定义超类的类型时,我只使用了objective-c。例如class: Car, subclass: Ford
我将Ford
对象投射到(Car *)
但是我正在阅读一些示例代码,我发现了这个:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
CoursesTableViewController *cvtc = (CoursesTableViewController *) [[nav viewControllers] objectAtIndex:0];
cvtc.managedObjectContext = self.managedObjectContext;
return YES;
}
为什么nav
已经转换为(UINavigationController *)
?同样适用于cvtc
,但对于TableViewController
答案 0 :(得分:3)
self.window.rootViewController
的类型为UIViewController
而不是UINavigationController
。并UINavigationController
继承UIViewController
。这就是它被类型化的原因。
同样,CoursesTableViewController
被强制转换为[[nav viewControllers] objectAtIndex:0];
的返回类型为id
。
答案 1 :(得分:0)
为什么nav已经转换为(UINavigationController *)?
self.window.rootViewController
提供了窗口的内容视图。
它会将结果内容视图返回为UIViewController
。您可能会被分配任何派生自UIViewController的类self.window.rootViewController
。
因此按照你的代码投射它是你的责任。
同样适用于cvtc但是对于TableViewController的自定义子类
以上解释将涵盖这一点。