Параметры скрывают переменные экземпляра в Objective-C - PullRequest
9 голосов
/ 11 августа 2009

Есть ли способ присвоить параметру методу то же имя, что и переменной экземпляра в Objective-C, не скрывая эту переменную?

Например,

- (void)doSomething:(id)object
{
    self.object = object;
}

Приведенный выше код выдает предупреждение «локальное объявление объекта» скрывает переменную экземпляра. »

Очевидное решение состоит в том, чтобы называть аргументы параметров по-разному, но меня раздражает необходимость выбирать имя типа «anObject» вместо «object».

Ответы [ 2 ]

13 голосов
/ 11 августа 2009

Возможно, вы сможете сделать что-то вроде self->object = object, но соглашение Objective C (производное от Smalltalk) заключается в том, чтобы префиксировать параметры с помощью «a» или «an», если параметр имеет то же имя, что и переменная экземпляра.

8 голосов
/ 11 августа 2009

Вы можете использовать точечную нотацию для доступа к свойствам (как в примере), но у переменных экземпляра есть только один путь доступа, поэтому единственное решение, если вы хотите получить доступ как к переменной экземпляра, так и к локальной переменной, - это дать им разные имена.

Формально это связано с ограничениями на альфа-преобразование в лямбда-исчислении, а именно с тем, что связанная переменная должна оставаться связанной, а свободная переменная оставаться свободной.

Если вам не нравится префикс «an» для местных жителей, вы можете использовать соглашение префикса «_» для переменных экземпляра, поскольку они также являются эффективно защищенными переменными.

@interface AClass {
    id _object;
}
@property (retain) id object;
@end

@implementation AClass
@synthesize object = _object;

- (void)doSomething:(id)object
{
    [_object befriend:object];
}
...

Конечно, «_» читается как «мой», поэтому он может быть таким же неприятным, как «a» / «an» перед параметрами. Переименование является лучшим решением, так как экземпляры и локальные переменные имеют разные роли, и их имена должны отражать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...