如何声明由可变类型支持的不可变属性?

时间:2011-10-10 08:47:53

标签: objective-c properties

我想声明一个公共的不可变属性:

@interface Foo
@property(strong, readonly) NSSet *items;
@end

...在实现文件中以可变类型支持:

@interface Foo (/* private interface*/)
@property(strong) NSMutableSet *items;
@end

@implementation
@synthesize items;
@end

我想要的是实现中的可变集合,当从外部访问时,它会被转换为不可变的集合。 (我不在乎调用者可以将实例强制转换回NSMutableSet并打破封装。我住在一个安静,体面的小镇,在那里不会发生这样的事情。)

现在我的编译器将该属性视为实现中的NSSet。我知道有很多方法可以让它工作,例如使用自定义getter,但有没有办法简单地使用声明的属性?

3 个答案:

答案 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