Как объявить неизменяемое свойство, поддерживаемое изменяемым типом?

Я хотел бы объявить публичную неизменную собственность:

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

… Поддержанный изменяемым типом в файле реализации:

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

@implementation
@synthesize items;
@end

То, что я хочу, - это изменяемая коллекция в реализации, которая преобразуется в неизменную при обращении извне. (Мне все равно, что вызывающая сторона может привести экземпляр к NSMutableSet и нарушить инкапсуляцию. Я живу в тихом, приличном городе, где таких вещей не бывает.)

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

3 ответа

Самое простое решение

@interface Foo {
@private
    NSMutableSet* _items;
}

@property (readonly) NSSet* items;

а потом просто

@synthesize items = _items;

внутри вашего файла реализации. Затем вы можете получить доступ к изменяемому набору через _items, но общедоступный интерфейс будет неизменным.

Вы должны объявить свойство в общедоступном интерфейсе только для чтения, чтобы компилятор не жаловался. Как это:

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

Вы можете просто сделать это самостоятельно в своей реализации:

@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
Другие вопросы по тегам