Я застрял в свойствах objective-c. Мне нужно назначить свойство только для записи для переменной, точно противоположную readonly, то есть переменная может иметь setMethod
, но она не должна иметь getMethod
. Я не знаю, как это сделать. ответы с некоторыми фрагментами кода приветствуются.
Напишите только свойство в Objective-C
Ответ 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]
.