Подтвердить что ты не робот

Что такое эквивалент Objective-C общедоступного свойства get/protected set в С#

Есть ли способ создать свойство вроде этого свойства С# в Objective-C?

public int prop { get; protected set;}

По сути, я хочу, чтобы можно было получить значение вне класса, но только чтобы можно было установить значение из класса.

4b9b3361

Ответ 1

Самый простой способ добиться этого - объявить свойство как readonly в открытом интерфейсе для MyClass (т.е. файла .h):

@property (readonly) NSInteger prop;

Затем в файле .m для этого класса объявите класс расширение (категория с пустым именем). В расширениях классов вы можете redeclare @property изменить его способность писать для записи:

@interface MyClass ()
@property (readwrite) NSInteger prop;
@end

@implementation MyClass
@synthesize prop;
...
@end

Конечно, Objective-C не применяет ограничений доступа, поэтому нет ничего, что вызывало бы вызов какого-либо изгоняющего кода от вызова -[MyClass setProp:]. Компилятор будет отмечать это как предупреждение, однако, что так хорошо, как вы можете получить в Objective-C. К сожалению, нет стандартного способа документировать это "защищенное" свойство записи в подклассы; вам придется согласиться на соглашение для своей команды и поместить его в общедоступную документацию для класса, если он находится в рамках, которые вы собираетесь выпустить.

Ответ 2

Я считаю, что вы ищете атрибут readonly на @property

@property (readonly) NSInteger prop;

Подробнее здесь.

Ответ 3

Нет способа сделать методы @private/@protected в ObjC, эти директивы компилятора применимы только к переменным экземпляра. Вы можете, однако, объявить статическую функцию C в том же файле, чтобы получить метод "@private".

Ответ keno кажется самым правильным способом достижения этого.