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

Инициализация свойства readonly

Я пытался создать свойство, которое только для чтения. Я хотел инициализировать со значением из класса, создающего экземпляр этого класса, например.

@property (retain,readonly) NSString *firstName;

И я попытался инициализировать его следующим образом:

-(id)initWithName:(NSString *)n{ self.firstName = n; }

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

4b9b3361

Ответ 1

Не используйте синтезированный сеттер:

firstName = [n retain]; //Or copy

Как правило, рекомендуется обойти сеттеры в любых методах init и dealloc.

Ответ 2

Либо назначьте переменную экземпляра напрямую (не забудьте добавить retain или copy, если вам это нужно), либо переопределите свойство в расширении частного класса. Вот так:

В вашем .h файле:

@property (readonly, copy) NSString *firstName;

В вашем .m файле:

@interface MyClass ()

// Redeclare property as readwrite
@property (readwrite, copy) NSString *firstName;

@end


@implementation MyClass

@synthesize firstName;
...

Теперь вы можете использовать синтезированный сеттер в своей реализации, но интерфейс класса по-прежнему показывает свойство как readonly. Обратите внимание, что другие классы, которые импортируют ваш .h файл, могут по-прежнему вызывать -[MyClass setFirstName:], но они не будут знать, что он существует, и получит предупреждение о компиляторе.

Ответ 3

Вы можете напрямую получить доступ к свойству с помощью:

_firstName = n;

Метод setter, который подразумевает self.firstName = n, не будет синтезирован, потому что вы указали readonly в @property (retain,readonly) NSString *firstName;, следовательно, ошибку компилятора.