Хорошая практика для устранения неоднозначности имен аргументов и имен переменных экземпляра в Objective-C

Я столкнулся с довольно распространенным сценарием в Objective-C, где я передаю переменную методу инициализации, а затем хочу назначить ее переменной экземпляра с тем же именем. Однако я не нашел способа охватить переменные, чтобы уточнить, какое значение из аргумента сообщения, а какое - переменная экземпляра.

Скажем, у меня есть класс, например следующий:

@interface MyObject
{
    NSString *value;
}
- (id)initWithValue:(NSString *)value;
@end

В моей реализации я хочу, чтобы мой метод инициализации выглядел примерно так:

- (id)initWithValue:(NSString *)value
{
    self = [super init];
    if(self) {
        self.value = value;  // This will not work with instance variables
    }
}

Я знаю три решения:

  1. Создать свойство, которое позволяет вызывать self.value
  2. Переименовать мою переменную экземпляра, например _value
  3. Переименовать мою переменную аргумента инициализации, например initValue или argValue

Мне не нравится любое из этих решений. Добавление свойства либо делает его общедоступным в интерфейсе, либо, если я использую расширение, скрывает его от наследников. Мне также не нравится использовать разные имена для переменных или подчеркивание, что, возможно, связано с разработкой на других языках, таких как Java и C #.

Есть ли способ отделить переменные экземпляра от аргументов сообщения? Если нет, есть ли в Какао руководство по кодированию для решения этой проблемы? Мне нравится следовать руководствам по стилю, когда это необходимо.

Обновление

Подумав, как это сделать в C, я пришел к решению self-> value . Это работает, но выдает предупреждение компилятора о том, что Локальное объявление 'value' скрывает переменную экземпляра. Так что это тоже не удовлетворительное решение, так как у меня цель нулевого предупреждения.

5
задан David V 30 August 2012 в 19:43
поделиться