Инициализация свойства только для чтения - PullRequest
25 голосов
/ 29 апреля 2010

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

@property (retain,readonly) NSString *firstName;

И я попытался инициализировать это так:

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

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

Ответы [ 3 ]

41 голосов
/ 29 апреля 2010

Либо присвойте переменную экземпляра напрямую (не забудьте добавить 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;
...

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

14 голосов
/ 29 апреля 2010

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

firstName = [n retain]; //Or copy

Обычно рекомендуется обходить сеттеры в любых методах init и dealloc.

5 голосов
/ 30 июня 2014

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

_firstName = n;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...