Там, где в вызове метода должен находиться объект определенного типа, можно поместить еще один вызов метода, который возвращает этот тип.

Таким образом, вызовы метода могут быть вложенными. Вызов метода может быть приемником в вызове метода:

// Глупо, но допустимо:
NSString* s = [ [NSString string] uppercaseString];

Приведенный код корректен, поскольку результатом метода string класса NSString является экземпляр NSString (формально, значение NSString*), так что мы можем отправить метод экземпляра NSString этому результату. Аналогично вызов метода может находиться в другом вызове в качестве аргумента:

[myStack push: [NSString string]]; II Все в порядке, если метод // push: ожидает параметр типа NSString*

Тем не менее я должен предостеречь вас от злоупотребления этой возможностью. Код с большим количеством вложенных квадратных скобок очень трудно читать (и писать). Кроме того, если один из вложенных вызовов возвращает непредвиденное значение, нет способа легко обнаружить этот факт. Зачастую куда лучше писать более подробный код и объявлять временные переменные для хранения результатов каждого вызова метода. Вот пример из моего собственного кода. Вместо чтобы написать

NSArray* агг = [[MPMediaQuery albumsQueryJ collections];

я воспользовался временной переменной:

 

MPMediaQuery* query = [MPMediaQuery albumsQuery];
NSArray* arr = [query collections];

Несмотря на то что первая версия короче и достаточно ясна и что во втором варианте переменная query никогда не будет использоваться еще раз (она существует исключительно для того, чтобы быть приемником сообщения collection во второй строке), ее все же стоило создать. Как минимум, это упрощает пошаговую отладку кода в отладчике, когда я хочу сделать паузу после вызова albumsQuery и посмотреть, правильный ли результат возвращается этим вызовом (см. главу 9).

 

Неверное количество или несоответствие вложенных квадратных скобок может привести к появлению несколько запутанных сообщений от компилятора. Например, слишком большое количество пар квадратных скобок ([ [query collections]]) или несбалансированное количество левых скобок ([ [query collections]) влекут за собой сообщение “Expected identifier” (“Ожидается идентификатор”).


 

 

 

Добавить комментарий