查看 iPhoneCoreDataRecipes 的 Apple 示例代码,我对 RecipeDetailViewController.m 中的以下代码段有疑问:

case TYPE_SECTION:
    nextViewController = [[TypeSelectionViewController alloc]
        initWithStyle:UITableViewStyleGrouped];
    ((TypeSelectionViewController *)nextViewController).recipe = recipe;
    break;

((TypeSelectionViewController *)nextViewController).recipe = recipe 行中,我知道内括号是将 View Controller 类型转换为 TypeSelectionViewController ,但是外括号有什么作用?

最佳答案

这与操作的优先级有关。

如果您查看 here ,您会发现点符号比强制转换具有更高的优先级。

所以这段代码:

(TypeSelectionViewController *)nextViewController.recipe

将由编译器转换为以下内容(因为 dot . notation 只是编译器的语法糖):
(TypeSelectionViewController *)[nextViewController recipe]

但是,我们想将 nextViewController 部分转换为类型 TypeSelectionViewController * ,而不是 [nextViewController recipe] 部分。所以这是不正确的。

所以我们写这个:
((TypeSelectionViewController *)nextViewController).recipe

编译器将其转换为:
[(TypeSelectionViewController *)nextViewController recipe]

这就是我们想要的。

关于编译器与运行时行为的注释

如果你编译这个错误转换的例子:
UILabel *label = [[UILabel alloc] init];
NSString *result = (UILabel *)label.text;

你会从编译器收到这样的消息:
Warning: incompatible pointer types initializing 'NSString *' with an
  expression of type 'UILabel *'

但是,由于Objective C 的弱类型,代码在运行时可以正常工作。 您可以在 LLVM docs 阅读更多相关信息,例如:

关于ios - 双括号是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19569342/

10-14 19:57