Как объявить неизменяемое свойство, поддерживаемое изменяемым типом? - PullRequest
20 голосов
/ 10 октября 2011

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

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

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

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

@implementation
@synthesize items;
@end

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

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

Ответы [ 3 ]

9 голосов
/ 10 октября 2011

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

@interface Foo {
@private
    NSMutableSet* _items;
}

@property (readonly) NSSet* items;

, а затем просто

@synthesize items = _items;

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

8 голосов
/ 09 декабря 2013

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

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 голосов
/ 10 октября 2011

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

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...