gpt4 book ai didi

ios - 双括号是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 06:23:19 24 4
gpt4 key购买 nike

查看 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

将由编译器转换为以下内容(因为点 . 符号只是编译器的语法糖):

(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 阅读更多相关信息。 ,例如:

The validity of conversions between object pointer types is not checked at runtime.

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com