Подтвердить что ты не робот

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

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, но есть ли способ сделать это просто с объявленными свойствами?

4b9b3361

Ответ 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