Цель-C: Как я могу спрятать ученика за пределами класса? - PullRequest
0 голосов
/ 30 декабря 2010

Я борюсь с чем-то, и я не нахожу никакого удовлетворительного решения.

У меня есть класс с членом "myMutableArray".

Я бы хотел, чтобы класс сам управлялдобавление и удаление элементов из массива, поэтому я не хочу, чтобы какой-либо другой класс имел доступ к члену и вызывал для него методы NSMutableArray.

В идеальной ситуации я хотел бы иметь частный получатель (чтобы иметь возможность вызывать self.myMutableArray) и общедоступный сеттер для этого участника.

Знаете ли вы, как мне этого добиться?

Другими словами:

Я быкак и другие классы

быть в состоянии звонить

- [oneInstance setMyMutableArray:thisArray]; // set
- oneInstance.myMutableArray = thisArray; // set using setter

- thisArray = oneInstance.myMutableArray; // get
- [oneInstance addItem:anItem]; // add

не в состоянии звонить:

- [oneInstance.myMutableArray add:etc...] // add

Я хотел бы, чтобы мой класс

был в состояниипозвонить

- self.myMytableArray = [NSMutableArray array]; // set
- thisArray = self.myMytableArray ; // get

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Есть ли причина, по которой вам нужен публичный сеттер? Похоже, сам класс владеет массивом. Возможно, было бы лучше, если бы вы не предоставляли доступ к общедоступным свойствам к полю и использовали открытый метод, который копирует значения в ваше приватное поле.

// public interface, in the .h file
@interface MyClass : // superclass, protocols, etc.
- (void) setSomething:(NSArray *)values;
@end

// private interface, not in the .h
@interface MyClass ()
@property (/* attributes */) NSMutableArray *myMutableArray;
@end

@implementation MyClass
@synthesize myMutableArray = myMutableArray_;

- (void) setSomething:(NSArray *)values
{
    [self.myMutableArray setArray:values];
}

@end
0 голосов
/ 30 декабря 2010

foo.h

@interface Foo : NSObject
@property(readonly, retain) NSArray * myReadonlyArray;
- (void) addItem: (Item *) anItem;
- (BOOL) publiclyDoSomething;
@end

Foo.m

@interface Foo()
@property(readwrite, retain) NSMutableArray * myMutableArray;
- (void) doSomethingInPrivate;
@end

@implementation Foo
@synthesize myMutableArray = myMutableArray_;

- (void) addItem: (Item *) anItem
{
    // assuming myMutableArray_ was already iniitialized
    [self.myMutableArray addObject: anItem];
}

- (NSArray *)myReadonlyArray
{
     return self.myMutableArray;
}

... rest of methods (including the public/private) implementations ...
@end

Некоторые детали:

  • Objective-C имеет "переменные экземпляра", а не "переменные-члены".

  • Вышеприведенные определения определяют публичный геттер и приватный сеттер, который синтезируется автоматически. Для ясности я также добавил публичный метод и приватный метод.

  • «Public» и «private» в Objective-C полностью определяются видимостью компилятора. Сеттер для myMutableArray и метод doSomethingInPrivate являются только частными, потому что их объявления в @interface не могут быть импортированы.

  • self.myMutableArray и [self myMutableArray] делают то же самое; синтаксис . - это просто сокращенная схема для вызова эквивалентного метода (с несколькими подробностями крайнего случая за пределами этого вопроса)

  • @property в @interface - это просто сокращение для объявлений методов (с небольшим количеством дополнительных метаданных).

  • @interface Foo() - это расширение класса , а не категория . Он существует именно для цели, показанной выше; расширить @interface класса дополнительной декларативной информацией, область которой должна быть ограничена. Он может появиться в заголовочном файле, который, скажем, вы импортируете только в реализацию вашей библиотеки для создания частно-библиотечной функциональности.

  • @dynamic используется, когда вы ни @synthesize, ни @property , ни не предоставляете реализацию традиционного метода. Иначе не нужно!

Я, наверное, что-то забыл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...