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

Напишите только свойство в Objective-C

Я застрял в свойствах objective-c. Мне нужно назначить свойство только для записи для переменной, точно противоположную readonly, то есть переменная может иметь setMethod, но она не должна иметь getMethod. Я не знаю, как это сделать. ответы с некоторыми фрагментами кода приветствуются.

4b9b3361

Ответ 1

Вы можете сделать что-то вроде:

@interface MyClass {
@private
int _var;
}

- (void)setVar:(int)newVar;
@end

@implementation MyClass
- (void)setVar:(int)newVar {
_var = newVar;
}
@end

Теперь вы можете получить доступ к переменной var как свойство, предназначенное только для записи:

@implementation SomeOtherClass
...
MyClass c = [[MyClass alloc] init];
c.var = 3;
...
@end

И если вы попытаетесь прочитать фальшивое свойство, то компилятор предупредит вас.

Ответ 2

Еще один действительный подход - объявить нормальное свойство и сделать недоступным getter

@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end

Это вызовет ошибку времени компиляции, если кто-то попытается получить доступ к получателю.


Основное преимущество этого подхода состоит в том, что у вас действительно есть реальное свойство TM, а не суррогат, подделанный переменной экземпляра и сеттер, что подразумевает, что:

  • вы получите автозаполнение при использовании точечной нотации в Xcode
  • все функции времени выполнения, такие как class_getProperty и class_copyPropertyList будет работать как ожидалось.

Тем не менее, реализация getter синтезирована в любом случае и может быть вызвана с использованием чего-то вроде

NSString * string = [myObj performSelector:@selector(var)];

или используя NSInvocation (в случае свойства не id)

Если вы параноик, и вы действительно хотите, чтобы клиент не вызывал геттер, вы можете явно исключить исключение, предоставив свою собственную реализацию.

@implementation MyClass
- (int)var {
    [NSException raise:NSInternalInconsistencyException
                format:@"property is write-only"];
}
@end

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

Ответ 3

Есть ли причина, по которой это должно быть свойство? Я просто объявляю установщик как метод и использую обычный синтаксис [foo setVar:bar].