Как объявить неизменяемое свойство, поддерживаемое изменяемым типом?
Id нравится объявлять публичное неизменяемое свойство:
@interface Foo
@property(strong, readonly) NSSet *items;
@end
... поддерживаемый с помощью изменяемого типа в файле реализации:
@interface Foo (/* private interface*/)
@property(strong) NSMutableSet *items;
@end
@implementation
@synthesize items;
@end
То, что я хочу, - это изменяемая коллекция в реализации, которая бросается в неизменяемую при доступе извне. (Меня не волнует, что вызывающий может вернуть экземпляр обратно в NSMutableSet
и сломать инкапсуляцию. Я живу в тихом, приличном городе, где таких вещей не бывает.)
В настоящий момент мой компилятор рассматривает свойство как NSSet
внутри реализации. Я знаю, что есть много способов заставить его работать, например, с пользовательскими getters, но есть ли способ сделать это просто с объявленными свойствами?
Ответы
Ответ 1
Самое простое решение -
@interface Foo {
@private
NSMutableSet* _items;
}
@property (readonly) NSSet* items;
а затем просто
@synthesize items = _items;
внутри вашего файла реализации. Затем вы можете получить доступ к изменяемому набору через _items, но открытый интерфейс будет неизменным.
Ответ 2
Вы должны объявить свойство в открытом интерфейсе как только для чтения, чтобы компилятор не жаловался. Вот так:
Word.h
#import <Foundation/Foundation.h>
@interface Word : NSObject
@property (nonatomic, strong, readonly) NSArray *tags;
@end
Word.m
#import "Word.h"
@interface Word()
@property (nonatomic, strong) NSMutableArray *tags;
@end
@implementation Word
@end
Ответ 3
Вы могли бы сделать это сами в своей реализации:
@interface Foo : NSObject
@property(nonatomic, retain) NSArray *anArray;
@end
--- файл реализации ---
@interface Foo()
{
NSMutableArray *_anArray;
}
@end
@implementation Foo
- (NSArray *)anArray
{
return _anArray;
}
- (void)setAnArray:(NSArray *)inArray
{
if ( _anArray == inArray )
{
return;
}
[_anArray release];
_anArray = [inArray retain];
}
- (NSMutableArray *)mutablePrivateAnArray
{
return _anArray;
}
@end