0

rootViewController クラスが CoursesTableViewController に設定されたストーリーボードがあります。

appDelegate で、この例のように型キャストを使用する必要があるのはなぜですか...

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    CoursesTableViewController *cvtc 
       = (CoursesTableViewController *)self.window.rootViewController;

なぜ私はこれを行うことができないのですか...

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    CoursesTableViewController *cvtc = self.window.rootViewController;
4

3 に答える 3

2

あなたがしていることは、ダウンキャストと呼ばれます。ポリモーフィズムにより、特定のクラスのオブジェクトへのポインター、そのクラスのサブクラスのオブジェクトへのポインターへのポインターの割り当てが許可されるため、これを行う必要がありますが、その逆は許可されません (ポインターが実際に指すとは言われていないため)そのサブクラスに属するオブジェクトであり、逆の場合はこれが保証されます)。

これはUIWindowあなたが呼んでいるプロパティです:

@property(nonatomic, retain) UIViewController *rootViewController;  

ご覧のとおり、タイプUIViewControllerは でCoursesTableViewControllerあり、サブクラスですUIViewController

PS : 必要だと言うときは、コンパイラの警告を回避するためです。

于 2013-07-20T00:14:24.900 に答える
0

あなたは実際にそれを行うことができます。あることを期待していて、別のことを見ているので、それについて警告するだけです。キャストしているときは、実行していることに問題がないことをコンパイラに知らせる方法にすぎません。

そのタイプ:

ここに画像の説明を入力

于 2013-07-20T00:16:06.613 に答える
0

rootViewControllerUIWindowタイプのプロパティですUIViewController

タイプに固有のプロパティとセレクターとのインターフェースが必要な場合は、コントローラーのタイプにキャストする必要があります。

于 2013-07-20T00:12:00.920 に答える