我想声明一个公共的不可变属性:
@interface Foo
@property(strong, readonly) NSSet *items;
@end
...在实现文件中以可变类型支持:
@interface Foo (/* private interface*/)
@property(strong) NSMutableSet *items;
@end
@implementation
@synthesize items;
@end
我想要的是实现中的可变集合,当从外部访问时,它会被转换为不可变的集合。 (我不在乎调用者可以将实例强制转换回NSMutableSet
并打破封装。我住在一个安静,体面的小镇,在那里不会发生这样的事情。)
现在我的编译器将该属性视为实现中的NSSet
。我知道有很多方法可以让它工作,例如使用自定义getter,但有没有办法简单地使用声明的属性?
答案 0 :(得分:9)
最简单的解决方案是
@interface Foo {
@private
NSMutableSet* _items;
}
@property (readonly) NSSet* items;
然后只是
@synthesize items = _items;
在您的实施文件中。然后你可以通过_items访问可变集,但公共接口将是一个不可变集。
答案 1 :(得分:8)
您必须将公共接口中的属性声明为readonly,以便编译器不要抱怨。像这样:
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
答案 2 :(得分:2)
您可以在实施中自行完成:
@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