2013-10-24 3 views
3

Глядя на пример кода Apple, для iPhoneCoreDataRecipes, у меня есть вопрос о ниже фрагменте из RecipeDetailViewController.m:Что означают двойные скобки?

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

В линии ((TypeSelectionViewController *)nextViewController).recipe = recipe, я понимаю, что внутренняя скобка являются типаж контроллер представления в качестве TypeSelectionViewController , но что делает внешняя скобка?

+5

Приоритет оператора. Вы хотите посмотреть '.recipe'' nextViewController' как '(TypeSelectionViewController *)'. Вы не хотите использовать 'nextViewController.recipe' как' (TypeSelectionViewController *) '. – nhgrif

ответ

9

Это связано с старшинства операций собственности.

Если вы посмотрите 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, например .:

Действительность преобразования между типами указателей объект не проверяется во время выполнения.

+0

Хорошее объяснение! –

+0

И никогда не больно иметь дополнительные парсеры, если вы не уверены в правилах приоритета. Они ничего не стоят. –

+0

Отличное объяснение. Благодарю. –

0

Это слепок, это сказать, рассмотреть nextViewController является экземпляром TypeSelectionViewController, так что вы можете использовать его рецепт

+1

Это не отвечает на вопрос. В вопросе уже говорится, что он понимает актерский состав. Вопрос касается внешних скобок. – rmaddy

Смежные вопросы