Расширение класса для основных методов данных - PullRequest
3 голосов
/ 03 апреля 2012

Может кто-нибудь подсказать мне, как «спрятать» стандартные основные установщики данных?

Я знаю, что на самом деле нет способа определить «частные» методы в Objective-C, но читайте об использовании расширениядобиться аналогичного результата.Проблема в том, что я хочу применить это к основным классам данных.Я хотел бы скрыть стандартные сеттеры, созданные для некоторых атрибутов, и вызывать их только из других открытых экспозиционных сеттеров.

Пример: мой основной объект данных имеет BOOL «собрано» и дату «dateCollected».Я выяснил, как добавить setDateCollected к setCollected, но теперь я хотел бы «спрятать» набор, чтобы его нельзя было так легко вызвать напрямую (когда я мог бы забыть также установить dateCollected вручную).

Чтобы прояснить, часть, которая сбивает меня с толку - это вызовы @dynamic - я не знаю, где они должны жить.

РЕДАКТИРОВАТЬ - я думаю, что пропустил часть.Я могу просто переместить объявление @property в файл реализации.Но я хочу, чтобы установщик был скрыт, а получатель оставался открытым.Я думаю, мне нужно заменить @property, но я не знаю, как это сделать для основного объекта данных.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

То, что вы пытаетесь сделать, вряд ли приведет к хорошему результату. Базовые классы данных очень деликатно настраиваются с помощью иерархий графов, а реализации свойств живут в суперклассе. Возможно, вам следует исключить собранную переменную и просто проверить ноль на dateCollected. Еще один более запутанный способ - удалить его из модели данных и сделать его регулярным иваром.

РЕДАКТИРОВАТЬ: Хорошо, я посмотрел на информацию в вашем комментарии. Это действительно говорит о том, что вы можете переопределить реализацию, если вы придерживаетесь определенных рекомендаций. Тем не менее, ответ ниже, вероятно, лучше. Переместите свойство в закрытый интерфейс. Затем объявите другое свойство в общедоступном интерфейсе (только для чтения), которое возвращает значение частного свойства;).

0 голосов
/ 03 апреля 2012

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

@interface MyAppViewController : UIViewController

@property (strong, nonatomic) NSString *myPublicStringObject;

- (NSString *) myPublicMethodTakingInputString:(NSString *) input;

@end

В файле реализации вы можете определить частные свойства и методы следующим образом.

#import "MyAppViewController.h"

// Declare private properties and methods inside the following interface extension
@interface MyAppViewController ()

@property (strong, nonatomic) NSNumber     *myPrivateNumber;
@property (strong, nonatomic) NSString     *myPrivateStringObject;

- (void) myPrivateMethod1;
- (NSString *) myPrivateMethod2WithIntegerInput:(NSInteger) input;

@end


@implementation MyAppViewController

@synthesize myPublicStringObject;
@synthesize myPrivateNumber;
@synthesize myPrivateStringObject;

// Implement all methods declared in header and private interfaces here in no particular order
- (NSString *) myPublicMethodTakingInputString:(NSString *) input
{
// code for myPublicMethodTakingInputString
}

- (void) myPrivateMethod1
{
}

- (NSString *) myPrivateMethod2WithIntegerInput:(NSInteger) input
{
}


// Implement any other private method not declared
- (NSString *) myUndeclaredPrivateMethod1:(NSString *) input
{
// code for myUndeclaredPrivateMethod1
}


- (id) myUndeclaredPrivateMethod2
{
// code for myUndeclaredPrivateMethod2
}

... и т. Д.

Это описание для iOS 5, конечно. Синтаксис для iOS3 и 4 аналогичен, за исключением того, что в заголовочном файле отображаются частные мгновенные переменные (iVars), что может быть очень запутанным для новичков. iOS 5 исправила это, не требуя, чтобы мгновенные переменные появлялись где-либо.

...